还在用grep翻代码?用BM25给Claude Code装个语义搜索引擎
场景:为什么普通搜索总是不够用?
grep 找关键字,ripgrep 可以正则——但如果你想说「给我找到跟『CSRF 中间件』最相关的 10 个文件」,它就哑火了。
传统搜索只能匹配词,不能理解语义。你明明知道这个代码库里有处理认证流的东西,但记不住变量名——怎么办?
今天推荐一个 Claude Code 专属 Skill——bm25,专门解决这个。
bm25 是什么?
bm25 是一个基于 BM25 算法(Okapi BM25,信息检索领域经典算法)的语义排序搜索工具。
它不是向量搜索,不依赖 Embedding 模型,纯靠词频和文档长度归一化打分——但效果出乎意料地好,尤其在代码 + 文档混合的场景。
核心特点:
- 无需 Embedding:安装依赖
uv pip install bm25s,秒装完 - 无状态:每次启动重建内存索引,不污染会话
- 支持多语料:本地目录、GitHub 仓库(直接拉 tarball)、项目文档、用户上传文件
- 过滤灵活:可以只搜
.py文件、排除tests/* - 交互模式:一条命令进入 REPL,多次查询复用同一个索引
- 结果排序:返回 Top-K 最相关的文件,带上下文 snippet
怎么用?
安装 Skill(Claude Code):
npx skills add oaustegard/claude-skills --skill bm25 --agent claude-code
基础用法:
# 搜本地代码库
python3 bm25.py ./repo 'csrf middleware'
# 一次建索引,多次查询
python3 bm25.py ./repo 'auth flow' 'session backend'
# 直接搜 GitHub 仓库(不用 clone)
python3 bm25.py 'github.com/django/django' 'atomic transaction'
# 只搜 Python 文件
python3 bm25.py ./repo 'config' --include '*.py'
# 输出 JSON(方便程序处理)
python3 bm25.py ./repo 'auth flow' --json
触发关键词:「哪个文件最关于 X」「rank these documents」「find content about X」——Claude Code 会自动识别并调用。
bm25 vs 其他搜索工具,怎么选?
| 场景 | 推荐工具 |
|---|---|
| 找正则匹配的代码行 | grep / ripgrep |
| 找符号定义/引用 | tree-sitting(:find) |
| 用自然语言概念搜代码 | bm25 |
| 精确的 AST 结构分析 | searching-codebases |
简单说:bm25 填补了语义搜索和代码结构搜索之间的空白——当你想用「关于 XX」这种问法时,它最合适。
GitHub 链接
- Skill 仓库:https://github.com/oaustegard/claude-skills
- 底层库(1.7K ⭐):https://github.com/xhluca/bm25s
- License:MIT
评论区
0 条评论
登录后可评论。