语义代码搜索工具

Semantica Search MCP 是一款利用AI嵌入技术实现自然语言搜索代码库的工具,支持TypeScript、JavaScript和Ruby等多种编程语言,适用于开发人员快速定位和理解代码。

  • by minhhua-EH
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 minhhua-EH/semantica-search-mcp

使用说明

语义搜索MCP

🔍 Claude code的语义代码搜索 -使用带有AI嵌入的自然语言对代码库进行索引和搜索


为什么选择Semantica?

问题: 查找代码 grep 或者正则表达式速度慢,需要精确的语法,并且缺少语义关系。

解决方案: Semantica使用AI嵌入为您的代码库建立索引,实现自然语言搜索:

❌ Traditional: grep -r "def authenticate" app/
✅ Semantica: "Find authentication logic"
   → Returns auth functions, middleware, login flows across all files

实例:

  • “数据库连接在哪里配置?”→ 返回数据库设置和连接代码
  • “显示错误处理模式”→ 返回try/catch块、错误类、救援块
  • “查找用户验证逻辑”→ 返回验证器、服务方法、模型验证

✨ 主要特点

🚀 生产准备就绪(第1-3阶段完成)

  • ✅ 索引成功率100% -AST分割合并分块消除了错误
  • ✅ 比本地快2倍 -OpenAI提供商的表现优于Ollama
  • ✅ 自动重新索引 -Git挂钩保持索引新鲜(<10s更新)
  • ✅ 多个供应商 -Ollama(本地,免费)或OpenAI(云,快速)
  • ✅ 增强的用户体验 -飞行前估计、进度跟踪、明确指导

🌳 基于AST的索引

  • 智能代码分块保留了函数/类边界
  • 使用树形图进行语言感知解析
  • 50%块减少与初始分割
  • 支持TypeScript、JavaScript、Ruby

🎯 混合搜索

  • 结合向量相似度(语义)+TF-IDF(关键字)
  • 比仅矢量搜索效率高40%
  • 使用特定于代码的同义词进行查询扩展
  • 按查询类型动态调整权重

⚡ 自动重新索引

  • Git挂钩自动检测更改
  • 增量更新在10秒内完成(快42倍!)
  • 基于Merkle树的变化检测
  • 后台处理(非阻塞)

🚀 快速开始

选项1:本地设置(免费,私人)

先决条件: 码头工人

# 1. Start services
docker run -d -p 19530:19530 milvusdb/milvus:latest
docker run -d -p 11434:11434 ollama/ollama:latest
docker exec ollama ollama pull nomic-embed-text

# 2. Install Semantica
git clone <your-repo-url>
cd semantica-search-mcp
npm install && npm run build

# 3. Configure Claude Code
# Add to ~/.config/claude/claude_desktop_config.json (Linux)
# Or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
  "mcpServers": {
    "semantica-search": {
      "command": "/absolute/path/to/semantica-search-mcp/build/index.js"
    }
  }
}

# 4. Index your first project
# In Claude Code:
"Index the codebase at /path/to/your-project"

选项2:云设置(快速、可扩展)

先决条件: OpenAI API密钥

# 1. Install Semantica (same as Option 1, steps 2-3)

# 2. Set API key
export OPENAI_API_KEY="sk-..."

# 3. Create project config
# In your project: .semantica/config.json
{
  "embedding": {
    "provider": "openai",
    "model": "text-embedding-3-small",
    "dimensions": 1536,
    "batchSize": 128,
    "concurrency": 3,
    "openai": {
      "apiKey": "${OPENAI_API_KEY}",
      "timeout": 30000
    }
  },
  "vectordb": {
    "provider": "milvus",
    "collectionName": "my_project"
  }
}

# 4. Index your project (same as Option 1)

⚙️ 配置指南

配置文件位置

.semantica/config.json 在项目根目录中

完整配置参考

{
  "version": "1.0.0",

  "project": {
    "name": "my-project",
    "root": "/path/to/project",
    "languages": ["typescript", "javascript", "ruby"]
  },

  "indexing": {
    "granularity": "hybrid",
    "chunkingStrategy": "ast-split-merge",
    "maxChunkSize": 250,
    "overlap": 50,
    "include": ["src/**/*", "lib/**/*"],
    "exclude": ["node_modules/**", "**/*.test.*"],
    "languageConfig": {
      "typescript": {
        "extensions": [".ts", ".tsx"],
        "chunkTypes": ["function", "class", "interface", "type"]
      },
      "ruby": {
        "extensions": [".rb"],
        "chunkTypes": ["def", "class", "module"]
      }
    }
  },

  "embedding": {
    "provider": "openai",
    "model": "text-embedding-3-small",
    "dimensions": 1536,
    "batchSize": 128,
    "concurrency": 3,
    "openai": {
      "apiKey": "${OPENAI_API_KEY}",
      "timeout": 30000
    }
  },

  "vectordb": {
    "provider": "milvus",
    "collectionName": "my_project",
    "milvus": {
      "host": "localhost",
      "port": 19530,
      "indexType": "IVF_FLAT",
      "metricType": "COSINE"
    }
  },

  "search": {
    "strategy": "hybrid",
    "maxResults": 10,
    "minScore": 0.5,
    "hybrid": {
      "vectorWeight": 0.7,
      "keywordWeight": 0.3
    }
  }
}

配置选项说明

indexing -要索引哪些文件

选项 类型 描述 最佳实践
granularity "hybrid" "function" "file"
chunkingStrategy "ast-split-merge" 分块算法 使用 "ast-split-merge" (100%成功)
maxChunkSize number 每个块的最大令牌数 250(最适合嵌入)
include string[] 要索引的全局模式 ["src/**/*", "app/**/*"]
exclude string[] 要跳过的全局模式 ["**/*.test.*", "node_modules/**"]
languageConfig object 语言特定设置 为每种语言定义

最佳实践:

{
  "include": ["src/**/*", "lib/**/*"], // Core code only
  "exclude": [
    "node_modules/**", // Dependencies
    "**/*.test.*", // Tests
    "**/*.spec.*", // Specs
    "dist/**", // Build output
    "coverage/**" // Test coverage
  ]
}

embedding -如何生成嵌入

选项 类型 描述 最佳实践
provider "ollama" "openai" 嵌入服务
model string 型号名称 "nomic-embed-text" 或 "text-embedding-3-small"
dimensions 数字 矢量维度 768(Ollama)或1536(OpenAI)
batchSize number 每批块数 64-128(平衡速度/内存)
concurrency number 并行批次 3-5(基于提供商级别)

Ollama设置(本地,免费):

{
  "provider": "ollama",
  "model": "nomic-embed-text",
  "dimensions": 768,
  "batchSize": 64,
  "concurrency": 5,
  "ollama": {
    "host": "http://localhost:11434",
    "timeout": 30000
  }
}

OpenAI设置(云,快速):

{
  "provider": "openai",
  "model": "text-embedding-3-small",
  "dimensions": 1536,
  "batchSize": 128,
  "concurrency": 3,
  "openai": {
    "apiKey": "${OPENAI_API_KEY}",
    "timeout": 30000
  }
}

vectordb -在哪里存储矢量

选项 类型 描述 最佳实践
provider "milvus" 矢量数据库 使用 "milvus" (成熟、可扩展)
collectionName string 集合/索引名称 每个项目唯一
host string 数据库主机 "localhost" 对于本地
port number 数据库端口 19530(Milvus默认值)
indexType "IVF_FLAT" 索引算法 "IVF_FLAT" (平衡良好)
metricType "COSINE" 距离度量 "COSINE" (最适合代码)

search -如何搜索

选项 类型 描述 最佳实践
strategy "hybrid" 搜索算法 使用 "hybrid" (改善40%)
maxResults number 要返回的结果 10-20(避免淹没)
minScore number 相似度阈值 0.5-0.7(按项目调整)
vectorWeight number 语义权重(0-1) 0.7(语义偏好)
keywordWeight number 关键字权重(0-1) 0.3(补码)

🎯 最佳实践

适用于小型项目(<500个文件)

{
  "indexing": {
    "include": ["src/**/*"],
    "exclude": ["**/*.test.*"]
  },
  "embedding": {
    "provider": "ollama", // Free, fast enough
    "batchSize": 32,
    "concurrency": 3
  }
}

时间: <1分钟 成本: 自由

中型项目(500-5K文件)

{
  "indexing": {
    "include": ["src/**/*", "lib/**/*"],
    "exclude": ["node_modules/**", "**/*.test.*", "dist/**"]
  },
  "embedding": {
    "provider": "openai", // Faster, worth the cost
    "batchSize": 128,
    "concurrency": 3
  }
}

时间: 2-5分钟 成本: $0.05-$0.15

适用于大型项目(5K-10K文件)

{
  "indexing": {
    "include": [
      "app/models/**/*", // Focus on core business logic
      "app/services/**/*",
      "app/queries/**/*"
    ],
    "exclude": [
      "**/*.test.*",
      "app/controllers/**", // Exclude less critical code
      "app/views/**"
    ]
  },
  "embedding": {
    "provider": "openai",
    "batchSize": 128,
    "concurrency": 3 // Safe for Tier 1
  }
}

时间: 10-15分钟 成本: $0.10-$0.25

用于CI/CD集成

{
  "embedding": {
    "provider": "openai", // No Docker needed!
    "concurrency": 2, // Conservative for CI
    "openai": {
      "apiKey": "${OPENAI_API_KEY}" // From CI secrets
    }
  }
}

优点: 无需本地基础设施,设置简单


📊 提供商比较

嵌入提供者

特性 Ollama OpenAI
成本 免费 每100万代币0.02美元
速度 6-7文件/秒 10-18文件/秒(快2倍)
隐私 100%本地 云API
设置 Docker+模型下载 仅限API密钥
最适合 隐私,免费层 速度,CI/CD

OpenAI模型

型号 尺寸 成本/1M代币 用例
text-embedding-3-small 1536 $0.02 ⭐ 推荐(最佳值)
文本嵌入-3大 3072 0.13美元 最高质量(6.5倍成本)
text-embedding-ada-002 1536 0.10美元 传统版(不推荐)

成本示例(OpenAI文本嵌入3-small)

项目大小 文件 估计。成本
小 50 <0.001美元
中等 500 0.01-0.05美元
大型 5000 0.10-0.50美元
非常大 10000 0.20-1.00美元

每日增量更新: <$0.10/天(几乎免费!)


🧪 测试结果和验证

单元测试:47/47通过✅

npm test

# Results:
Test Suites: 3 passed
Tests:       47 passed (21 Ollama + 26 OpenAI)
Coverage:    100% (providers)
Time:        ~25s

集成测试-真实代码库

使用真实的OpenAI和Ollama API进行测试:

项目 文件 块 时间(OpenAI) 时间(Ollama) 成功
项目A(TypeScript) 46秒 453秒 3.2秒 11.9秒 100%
项目B(Ruby) 2367 8474 2.25分钟 22.1s* 98.5%
项目C(Ruby) 8367 34761 13.1分钟 21.6分钟 97.4%

*Ollama基线的较小测试集(352个文件)

主要发现:

  • ✅ 对于大型仓库,OpenAI的速度提高了39-43%
  • ✅ 在最佳设置下的成功率为97-98%(并发性:3)
  • ✅ 成本可以忽略不计(每个项目0.001-0.12美元)
  • ✅ 增量重新索引:<10秒(两个提供者)

性能基准

索引速度

度量 目标 已实现 状态
小项目(<100个文件) <30s 3-10s ✅ 超过
中等项目(100-1K) <5分钟 2-3min ✅ 超过
大型项目(1K-10K) <15分钟 10-13分钟 ✅ 遇见
搜索延迟 <2s <1s ✅ 超过
增量更新 <10s <10s ✅ 遇见
成功率 99%+ 100% ✅ 超过

速度比较(OpenAI与Ollama)

大型Ruby项目(8367个文件,34761个块):

提供者 时间 速度 块/秒
Ollama 21.6分钟 6.5个文件/秒 28个块/秒
OpenAI(c:3) 13.1分钟 10.7个文件/秒 44块/秒

OpenAI节省8.5分钟(速度提高39%) 🚀


📖 使用示例

为代码库建立索引

"Index the codebase at /Users/me/Projects/my-app"

输出:

📊 Pre-flight check for my-app
────────────────────────────────────────────────────────

📁 Scope:
   • Files to index: 2,367
   • Estimated chunks: 8,474
   • Provider: openai

⏱️  Estimated time: ~2-3 minutes
   (This is a one-time operation)

💰 Estimated cost: ~$0.0297

🔍 System checks:
   ✅ Configuration file
   ✅ Vector database connection
   ✅ Embedding provider
   ✅ Disk space

✅ Ready to index!
   Indexing will run in background - you can continue working.

────────────────────────────────────────────────────────

🚀 Indexing started in background!

Job ID: index_1707445123
Estimated time: ~2-3 minutes
Estimated cost: ~$0.0297

💡 You can continue using Claude Code normally.
   Check progress: "Get index status"
   I'll show a summary when indexing completes!

📝 This is a one-time operation. Future updates via git hooks are <10s.

搜索代码

"Search for authentication logic in my-app"

退货:

🔍 Found 8 results (0.7s):

1. src/services/auth.service.ts:45-67 (score: 0.92)
   export class AuthService {
     async authenticate(credentials: Credentials) {
       // JWT-based authentication
     }
   }

2. src/middleware/auth.middleware.ts:12-28 (score: 0.87)
   export function requireAuth(req, res, next) {
     // Check JWT token
   }

检查索引状态

"Get index status for my-app"

索引时:

📊 Indexing in progress (Job #index_1707445123)

Phase: Embedding
Progress: 67.3% (5,700/8,474 chunks)
Speed: 52 chunks/s
ETA: 2.1 minutes

完成后:

✅ Index Status for my-app

Collection: my_app
Status: Ready
Vectors: 8,346
Dimensions: 1536
Last updated: 2 minutes ago

🏆 我们取得的成就

第2阶段改进(完成)

  • ✅ 100%索引成功 (94%)
  • ✅ 快8-10倍 (小型回购为5.9秒vs 42秒)
  • ✅ 自动重新索引 通过git钩子
  • ✅ 后台操作 (非阻塞)
  • ✅ 提高搜索质量 (TF-IDF+查询扩展)
  • ✅ JavaScript支持 添加

3.1阶段改进(完成)

  • ✅ OpenAI提供商 (大型仓库速度提高2倍)
  • ✅ 飞行前估算 (前期时间/成本)
  • ✅ 更好的用户体验 (明确的指导、建议)
  • ✅ 语言过滤 (仅支持索引类型)
  • ✅ 26个单元测试 (供应商100%覆盖)

🛠️ MCP工具

index_codebase -为项目建立索引

参数:

  • path (必填):项目根目录
  • background (可选):在后台运行(默认值:true)

特征:

  • 飞行前估算(文件、时间、成本)
  • 开始前进行健康检查
  • 默认情况下为背景模式
  • 进度跟踪
  • 漂亮的竣工总结

search_code -语义搜索

参数:

  • query (必填):自然语言搜索查询
  • maxResults (可选):结果数量(默认值:10)
  • minScore (可选):相似性阈值0-1(默认值:0.7)
  • language (可选):按语言筛选
  • pathPattern (可选):按路径正则表达式过滤

特征:

  • 混合搜索(矢量+关键字)
  • 查询扩展(同义词)
  • TF-IDF关键字提取
  • 用分数对结果进行排名

get_index_status -检查状态

特征:

  • 索引时的实时进度
  • 空闲时收集统计信息
  • 矢量计数和维度
  • 上次更新时间戳

其他工具

  • reindex_changed_files -增量更新(<10s)
  • enable_git_hooks -git操作的自动重新索引
  • onboard_project -一个命令设置
  • reset_state -紧急清理
  • clear_index -删除所有数据

⚡ 性能提示

优化速度

1.使用OpenAI (大型仓库速度提高2倍)

{ "embedding": { "provider": "openai", "concurrency": 3 } }

2.提高并发性 (如果是Tier 2+)

{ "embedding": { "concurrency": 5 } } // For Tier 2+ (5,000 RPM)

3.选择性索引 (仅索引核心代码)

{
  "indexing": {
    "include": ["app/models/**", "app/services/**"]
  }
}

优化成本

1.使用Olama (完全免费)

{ "embedding": { "provider": "ollama" } }

2.选择性索引 (更少的文件=更低的成本)

3.使用增量更新 (git挂钩,自动!)

优化可靠性

1.较低的并发性 (成功率97-98%)

{ "embedding": { "concurrency": 3 } } // vs 5: more reliable

2.使用Olama (100%成功,无速率限制)


🔧 故障排除

“找不到要索引的文件”

原因: 包含的图案与任何文件都不匹配

解决方案:

{
  "indexing": {
    "include": ["**/*.ts", "**/*.rb"], // Match all supported files
    "exclude": ["node_modules/**"]
  }
}

“矢量数据库不可访问”

原因: Milvus不跑

解决方案:

# Check if running
curl http://localhost:19530/healthz

# Start if needed
docker run -d -p 19530:19530 milvusdb/milvus:latest

“嵌入提供程序不可访问”

对于Ollama:

# Check if running
curl http://localhost:11434/api/tags

# Start if needed
ollama serve

对于OpenAI:

# Check API key is set
echo $OPENAI_API_KEY

# Set if missing
export OPENAI_API_KEY="sk-..."

速率限制(OpenAI)

症状: 重试消息多,成功率<95%

解决方案: 降低并发性

{
  "embedding": {
    "concurrency": 2, // Down from 3 or 5
    "batchSize": 64 // Down from 128
  }
}

索引速度慢

原因: 文件数量大或设置保守

解决:

  1. 选择性标引法 -仅索引核心目录
  2. 提高并发性 -如果没有费率限制
  3. 使用OpenAI -比Ollama快2倍
  4. 排除更多 -跳过测试、文档、生成的代码

🎓 高级用法

增量重新索引

自动(推荐):

"Enable git hooks for my-project"

Git挂钩自动更新索引:

  • 分支开关(<10s)
  • 拉取/合并操作(<10s)
  • 新提交(<10s)

手册:

"Re-index changed files in my-project"

多项目设置

独立索引多个项目:

# Project 1
cd /path/to/project1
# Create .semantica/config.json with collectionName: "project1"

# Project 2
cd /path/to/project2
# Create .semantica/config.json with collectionName: "project2"

# Index both
"Index the codebase at /path/to/project1"
"Index the codebase at /path/to/project2"

# Search specific project
"Search for auth in project1"

提供商切换

从Ollama切换到OpenAI:

  1. 更新配置:
{
  "embedding": {
    "provider": "openai",
    "dimensions": 1536 // Changed from 768!
  }
}
  1. 清除旧索引(维度已更改):
"Clear index for my-project"
  1. 重新索引:
"Index the codebase at /path/to/my-project"

📚 文档

所有配置选项都记录在本README中。有关开发指导,请参阅 CLAUDE.md.


🤝 贡献

开发设置

git clone <repo-url>
cd semantica-search-mcp
npm install
npm run build

开发流程

npm run watch          # Auto-rebuild on changes
npm test              # Run all tests
npm run test:watch    # Watch mode
npm run test:coverage # Coverage report
npm run inspector     # MCP debugging

代码质量

  • TypeScript:严格模式已启用
  • 测试:80%以上的覆盖率目标
  • 掉毛:自动格式化
  • 建筑:可扩展性的提供者模式

📈 性能指标

索引性能(第2阶段→ 第3阶段)

度量 第1阶段 第2阶段 第3阶段(OpenAI)
成功率 94% 100% 97-98%
小型存储库(50个文件) ~42秒 5.9秒 3.2秒
大型存储库(8K文件) 不适用 不适用 13.1分钟
增量更新 N/A <10s <10s

搜索质量

指标 目标 已实现
相关性(前5名) 90%+ 92%
延迟 <2s <1s
“无结果”率 <10% <5%

🔒 安全与隐私

数据处理

Ollama(当地):

  • ✅ 100%本地处理
  • ✅ 没有数据离开您的机器
  • ✅ 完全隐私

OpenAI(云):

  • ⚠️ 发送到OpenAI API的代码块
  • ⚠️ 仅嵌入(OpenAI无法搜索)
  • ⚠️ 为API键使用环境变量(从不提交!)

API密钥管理

永远不要提交API密钥:

{
  "openai": {
    "apiKey": "${OPENAI_API_KEY}" // ✅ Environment variable
  }
}

不是这个:

{
  "openai": {
    "apiKey": "sk-proj-..." // ❌ NEVER hardcode!
  }
}

🎯 常见问题解答

Q: 索引需要多长时间? A: 3s-15分钟,具体取决于尺寸。小项目(<100个文件):<30s。大型项目(5K+文件):10-15分钟。 这是一次性的 -增量更新小于10秒!

Q: OpenAI的价格是多少? A: 初始指数为每个项目0.001-0.20美元。每日更新:<0.10美元。大多数项目的成本比一杯咖啡还低! ☕

Q: 我可以在Ollama和OpenAI之间切换吗? A: 是的!只需更新配置并重新索引(维度更改需要清除旧索引)。

Q: 如果索引中断会发生什么? A: 重新运行。这是一个一次性操作,为了简单起见,不需要检查点。

Q: 它离线工作吗? A: 与Ollama合作:是(100%本地)。OpenAI:NO(需要互联网)。

Q: 这与Cursor或GitHub Copilot相比如何? A: 光标在1-3分钟内索引~500-2K个文件(带缓存)。我们在12-13分钟内对所有文件(8K+)进行索引。考虑到覆盖范围,速度更完整,可比。


🚀 接下来是什么

完成✅

  • 第一阶段:TypeScript/Ruby、Ollama、Milvus、AST分块
  • 第2阶段:100%成功,自动重新索引,JavaScript,性能
  • 第3.1阶段:OpenAI提供商、用户体验改进、测试

进行中🔄

  • 第3.2阶段:Qdrant矢量数据库提供程序(更轻便的替代品)
  • 第3.3阶段:专业文件
  • 第3.4阶段:版本v2.1.0

未来🔮

  • Python、Go、Java语言支持
  • 嵌入缓存(重新索引速度提高50-70%)
  • BM25关键字搜索
  • Web仪表板UI

📄 许可证

私人(目前)


🙏 致谢

基于以下研究构建:


问题或议题? 检查 文档 或制造问题。

准备好开始了吗? 跟随 快速开始 上面的向导! 🚀