ck
本地语义代码搜索引擎,通过 embedding 向量实现"按意思搜代码",支持 MCP 协议接入 A
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
本地语义代码搜索引擎,通过 embedding 向量实现"按意思搜代码",支持 MCP 协议接入 A
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

想象这样一个场景:深夜加班,你在调试一个积累了三年技术债务的老项目。要找"所有涉及权限校验的地方",但代码里从没出现过"permission"这个词——只有"role"、"access"、"verify"……grep 完全失效,常规搜索形同虚设。这时候,你需要的不只是关键词匹配,而是一个真正理解代码在做什么的工具。
ck(seek)正是为这个场景而生。它是一个本地优先的语义代码搜索引擎,能根据代码的含义而非字面文字进行搜索,堪称代码世界的"以文搜文"。
传统 grep 统治代码搜索数十年,功勋卓著,但它本质上是一个字符串匹配器——你必须精确知道要找什么,或者至少知道那些代码里写了什么关键词。问题是:代码的意图和它的措辞往往不一致。
一个"优雅降级"处理函数,可能叫 degrade_gracefully,也可能叫 fallback_mode,甚至根本没有函数名,只有一段注释。这种语义层面的搜索能力,长期以来只有云端 AI 代码助手(如 GitHub Copilot 的代码解释功能)才能提供——但它们需要联网、需要数据上传、有隐私顾虑。
ck 实现了三种互补的搜索模式,用户可以根据场景自由切换:
这是 ck 最核心的能力。它基于 embedding 向量模型,将代码片段和用户查询都转换为高维向量,在向量空间中寻找语义最相近的结果。
ck --sem "error handling" src/ # 找所有错误处理代码
ck --sem "authentication logic" src/ # 找认证相关逻辑
ck --sem "database connection pooling" # 找数据库连接池
语义搜索的关键优势在于同义词泛化:"retry logic" 能找到 backoff、circuit breaker、max_retries 等各种实现变体;"authentication" 能找到 login、auth、credentials 等相关代码,即使这些地方从未出现过"authentication"这个单词。
ck 完全兼容 grep 接口,所有肌肉记忆都能直接迁移:
ck -n "TODO" *.rs # 找所有 TODO 注释
ck -R "TODO|FIXME" . # 递归搜索
ck -l "error" src/ # 仅列出文件名
这确保了在语义搜索力有不逮的场景下(如搜索特定 API 调用路径),用户仍有精准控制的能力。
混合模式同时利用语义相似度和 BM25 关键词权重,通过 Reciprocal Rank Fusion 算法融合两种信号,特别适合在大型代码库中快速定位:
ck --hybrid "async timeout" src/
ck --hybrid --scores "cache" src/ # 显示相关性评分
ck 最具前瞻性的功能是将自己作为 MCP(Model Context Protocol)Server 运行,直接为 AI 编码助手提供搜索能力。
MCP 是 Anthropic 推动的 AI 工具互操作标准,让 Claude Desktop、Cursor 等 AI 工具可以调用外部工具。ck 实现了完整的 MCP 工具集:
semantic_search — 语义搜索regex_search — 正则搜索hybrid_search — 混合搜索index_status — 索引状态reindex — 强制重建索引health_check — 健康诊断这意味着 AI Agent 可以主动搜索代码库来辅助编程,而不只是被动等待人类提问。这对于自动化代码审查、重构辅助、依赖分析等场景意义重大。
# 启动 MCP Server
ck --serve
# Claude Desktop 配置
# claude mcp add ck-search -s user -- ck --serve
ck 提供了一个功能丰富的终端图形界面,通过 ck --tui 启动,支持:
ck 能在保持极高性能的同时实现复杂语义搜索,依赖其精心设计的模块化架构:
| Crate | 职责 | 关键依赖 |
|---|---|---|
ck-core | 通用类型定义、错误处理 | anyhow, serde |
ck-chunk | 代码分块(Tree-sitter 语法感知) | tree-sitter-* (13种语言) |
ck-embed | Embedding 模型封装 | FastEmbed, ONNX Runtime |
ck-models | 模型下载与管理 | hf-hub, tokenizers |
ck-index | 索引数据结构 | tantivy |
ck-engine | 搜索核心引擎 | tantivy, blake3, rayon |
ck-cli | 命令行参数解析 | clap |
ck-tui | 终端界面 | tokio, tracing |
向量搜索:ck 使用 Tantivy(Rust 版 Lucene)作为底层索引,结合 FastEmbed 提供的 BAAI/bge-small-en-v1.5 轻量 embedding 模型,在 CPU 上即可高效运行。
代码解析:通过 Tree-sitter 支持 13 种编程语言的语法感知分块(Rust/Python/TypeScript/JavaScript/Go/C/C++/C#/Haskell/Ruby/Zig/Dart/Elixir),确保搜索结果以函数/类等语义单元为单位,而非随意截断。
增量索引:ck 实现块级别的增量索引,仅对变更文件重新 embedding,典型开发场景下缓存命中率达 80-90%,避免每次搜索都全量重建。
并行计算:使用 Rayon 实现数据级并行,充分利用多核 CPU 加速索引构建。
ck 的 embedding 模型经过精心选择(bge-small 系列),参数量小到可以在纯 CPU 上快速推理,完全不需要 GPU。这让它成为普通开发机器上可用的工具,而不只是拥有高端硬件的研究人员专属。
ck 的安装极其简单:
cargo install ck-search
只要系统有 Rust 1.88+ 环境,一条命令完成安装。首次运行 ck --sem 时,ck 会自动下载 embedding 模型(约 100MB),之后即可正常使用。
对于已经安装过 Claude Code CLI 的用户,只需一行配置即可在 Claude 中使用 ck:
claude mcp add ck-search -s user -- ck --serve
部分用户指出 ck 在某些专业领域的语义搜索精度不如基于 GPT-4 等大模型的代码理解能力。ck 的 embedding 模型是小型专用品,与通用大模型的语义理解能力存在代差。
ck 的出现代表了一个重要趋势:本地化 AI 辅助工具的成熟。
长期以来,"AI 代码理解"似乎必须依赖云端大模型。但 ck 证明了,通过精心的模型选择(小型专用 embedding)和工程优化(Rust 高性能实现),完全可以在本地实现"够用"的语义搜索能力。
这一范式对隐私敏感型企业(金融、医疗、政府)意义重大:他们的代码不能上传到任何云服务,但开发者同样需要语义搜索能力。ck 为这类场景提供了合规的技术解法。
同时,ck 将自己接入 MCP 协议生态,为 AI Agent 提供"眼睛"——让 AI 在编程时能够主动搜索、理解代码库,而非只能基于当前对话上下文推理。这可能是 AI 编程助手进化的重要一步。
总结:ck 是一款工程精良的本地语义代码搜索引擎,在零云依赖的前提下,为开发者和 AI Agent 提供了"按意思搜代码"的能力。它的 Rust 实现保证了性能,Tree-sitter 保证了分块质量,MCP 集成打通了 AI Agent 工作流。尽管中文支持和 Web UI 是明显短板,但其核心价值——本地化语义搜索——填补了市场空白,值得在技术团队中推广使用。