【免费下载链接】cs
codespelunker - CLI code search tool that understands code structure and ranks results by relevance. No indexing required with CLI, TUI, MCP and HTTP support.
使用 cs(codespelunker)这款理解代码结构、按相关度排序的 CLI 代码搜索工具时,你是否遇到过这样的场景:搜索Copyright或某个错误提示词,结果里出现 100 条一模一样的命中?答案是加上--dedup参数——它能把字节级相同的匹配一键折叠为 1 条结果,把被副本淹没的排名还给真正重要的文件。🔍
重复命中100条,其实只有1条信息量
在大型仓库里做代码搜索,"重复命中"几乎 unavoidable:
- 版权头/许可证声明:每个源文件开头都有相同的 Copyright 文本,搜索
Copyright轻松命中几百条; - vendor / 第三方依赖:同一份代码被复制进多个目录,搜索
error时副本会霸占前列; - Monorepo 复制粘贴:工具函数、模板字符串被拷贝到多个子模块,逐字相同。
更隐蔽的问题是:cs 支持--result-limit限制结果数量,而重复文件会先挤占名额。不启用去重时,前 100 条里全是同一个 Copyright 头的副本,你真正想看的那个文件可能排在第 150 条——去重后腾出来的名额会被真正相关的结果回填(见 console.go 中"先 Dedup、再 Limit"的处理顺序)。
一键去重:cs "Copyright" --dedup
命令行下只需一个参数:
cs "Copyright" --dedup # 每个唯一版权声明只出现一次 cs "error" --dedup # 跳过 vendor / 复制产生的重复折叠后的结果里,每个唯一内容只保留得分最高的那个文件作为代表,并在该行下方用青色小字列出其余副本位置:
+3 duplicate(s) in: vendor/a/util.go, b/internal/util.go, c/pkg/util.go这样你既知道"这段内容一共有几份",又可以直接点击代表结果定位到最相关的那一份。
--dedup 是怎么工作的?(源码视角)
去重的核心逻辑在 pkg/ranker/dedup.go 中,可以概括为两步:
- 计算匹配指纹:
ComputeMatchHash把文件中所有命中区间的原始字节按位置排序后拼接,再取 SHA-256 作为指纹。注意——比较的是匹配到的字节内容,而不是整个文件,所以两个只有个别函数不同的文件不会被误伤; - 按指纹分组折叠:
DeduplicateResults假设输入已按得分降序排列,同指纹的组保留第一条(即最高分文件)作为代表,并把其余路径记入DuplicateCount与DuplicateLocations(字段定义见 pkg/common/common.go)。
配套的单测覆盖了相同内容、不同内容、全部相同、空结果等边界情况,可在 pkg/ranker/dedup_test.go 中查看。
不只 CLI:TUI、HTTP、MCP 四种模式都支持
--dedup是全局能力,四种运行模式均可启用:
| 模式 | 启用方式 | 参考位置 |
|---|---|---|
| CLI | cs "query" --dedup | main.go |
| TUI | cs --dedup | tui.go |
| HTTP | 搜索 URL 追加dedup=true或dedup=1 | http.go |
| MCP | search工具传dedup: true参数 | mcp.go |
HTTP 模式适合团队共享:把仓库 clone 到一个目录后启动服务,即可让所有人用网页版代码搜索:
cs -d --dir /path/to/repos浏览器请求里带上dedup=true即可获得折叠后的结果,JSON 响应中同样带有duplicateCount和duplicateLocations字段。
如果接入 AI 工具,cs --mcp启动的 MCP 服务器也把dedup作为search工具的布尔参数暴露出来,方便 LLM 在 Monorepo 场景下避免被重复代码刷屏。
3 个高频实战场景
1. 查版权声明,一眼看全
cs "Copyright" --dedup200 个文件、4 种不同的版权声明?折叠后正好 4 条,谁抄谁一目了然。
2. 排查 vendor 里混入的自定义代码
cs "myCompanyInternalError" --dedup副本再多,只剩一条,代表文件指向得分最高的位置。
3. 与路径过滤、语言过滤组合
cs "config" lang:go path:pkg --dedup cs "TODO" --dedup --only-comments--only-comments、lang:等结构过滤与--dedup完全兼容,先缩小范围再折叠,效果更干净。
常见问题
Q:去重会不会"丢掉"结果?不会。副本没有消失,只是折叠显示;代表结果下附带的+N duplicate(s) in: ...以及 JSON 输出里的duplicate_locations保留了全部原始路径。
Q:什么才算"重复"?匹配到的原始字节内容逐字相同才算。整个文件不同、只是命中片段相同,也会被折叠;反之文件相同、命中片段不同,则是两条结果。
Q:Error和error算重复吗?默认不算。搜索虽大小写不敏感,但去重比较的是文件中真实命中的字节,大小写不同会产生不同指纹。需要更严格时,可配合-c(大小写敏感搜索)使用。
Q:去重和--result-limit的先后顺序?先折叠、再截断,所以限制条数拿到的是"去重后"的前 N 条,不会被副本占坑。
小结
代码搜索重复命中100条?在 cs 里只需一个参数:
cs "你的关键词" --dedup字节相同的匹配折叠为 1 条,最高分文件留任代表,副本路径全程可追溯——CLI、TUI、HTTP、MCP 四种模式通用。更多查询语法与参数说明,可参考项目 README.md 及 pkg/search/README.md 中的完整文档。✨
【免费下载链接】cs
codespelunker - CLI code search tool that understands code structure and ranks results by relevance. No indexing required with CLI, TUI, MCP and HTTP support.
相关推荐
Ransack 合并搜索条件:借助共享 Context 将多个搜索折叠为一条 SQL 查询
Ransack 合并搜索条件:借助共享 Context 将多个搜索折叠为一条 SQL 查询 导读 当业务需要"同时匹配多个独立搜索条件"(例如"父记录名字为 A
后端搜索引擎maxvit_small_tf_384.in1k vs 同类模型:ImageNet-1k数据集上的Top-1精度与性能对比
maxvit_small_tf_384.in1k vs 同类模型:ImageNet 1k数据集上的Top 1精度与性能对比 HuggingFace镜像 / ti
fnet-base-encoded核心功能揭秘:掩码语言建模与句子预测双任务实战教程
fnet base encoded核心功能揭秘:掩码语言建模与句子预测双任务实战教程 fnet base encoded是基于PyTorch框架构建的预训练模型
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考