一天一个开源项目

开源项目第240期:XERJ —— 让 AI Agent 查索引而不是读文件,比 grep 省 40 倍 Token

一个兼容 Elasticsearch API 的本地 AI 搜索引擎:一条命令自动索引代码、文档、日志、PDF,让 Coding Agent 查询确切的代码段而不是逐文件读取。实测比 grep 驱动的 Agent 省 2.7 倍输出 Token,比纯记忆省 26 倍。Rust 编写,单一静态二进制,Apache-2.0 协议,7000+ Stars,Trendshift 趋势仓库。

·约 12 分钟阅读·Developer Tools

引言

"一个 Agent 用 grep 会把整个文件读进上下文;一个查询 XERJ 的 Agent,直接拿到那段代码。"

这是「每日一个开源项目」系列的第 240 篇。今天的项目是 XERJ —— 一个本地运行、兼容 Elasticsearch API 的 AI 搜索引擎,由 xerj-org 团队开发,7,015 颗 Star,Apache-2.0 协议,Trendshift 趋势仓库。

AI Coding Agent 的一个老问题是:当它需要理解一个陌生代码库时,常见的做法是 grep 定位,然后把命中行所在的整个文件读进上下文——这意味着哪怕只需要一个函数,也得把几百行甚至几千行塞进 Token 预算里。WordPress 核心代码大约有 520 万 Token,相当于 26 个满上下文窗口,Agent 根本没法"读完"它。XERJ 的解法很直接:用一条命令把任意目录自动建成可查询的索引(代码、文档、日志、PDF 都行),Agent 查询时拿到的是确切的那一段,而不是整份文件。

你会学到什么

  • XERJ 最核心的应用场景"参考式编码"(Reference Coding):让 Agent 先检索同类开源项目的实现方式,再写代码
  • autoindex 的"自动嗅探"机制:零 Schema、零 Pipeline 配置,一条命令处理代码/文档/日志/PDF/Unity 项目等几十种格式
  • 为什么它选择兼容 Elasticsearch API,而不是自己发明一套新协议
  • 快速上手:从一条安装命令到跑通 MCP 集成
  • 项目独特的"社区会员卡"机制——用一份使用反馈换取免费的 Apache-2.0 二进制

前提知识

  • 对 AI Coding Agent(Claude Code、Cursor 等)有基本使用经验
  • 了解 Elasticsearch 的基本概念(索引、查询 DSL、聚合)会更容易上手,但不是必需
  • 对 RAG(检索增强生成)的基本思路有所了解有助于理解其应用场景

项目背景

概述

XERJ 把自己定位为"社区信任的本地 AI 搜索引擎":核心能力是对任意文件夹自动建立索引,让 Coding Agent 不再需要逐文件阅读来理解代码库,而是直接查询拿到确切的代码片段。它最大的差异化卖点是完全兼容 Elasticsearch REST API——现有的 Elasticsearch 客户端、Kibana、各种周边工具可以直接连接 XERJ 而不需要任何改动,但底层是用 Rust 实现的单一静态二进制,不需要 JVM,不需要任何依赖。

作者 / 团队

  • 开发方: xerj-org,一个专门的组织账户
  • 主要语言: Rust
  • 许可证: Apache-2.0
  • 创建时间: 2026-06-30
  • 当前状态: 活跃开发中,Trendshift 趋势仓库

项目数据

  • ⭐ GitHub Stars: 7,015+
  • 🍴 Forks: 356+
  • 📄 许可证: Apache-2.0
  • 📅 创建时间: 2026-06-30
  • 👥 核心贡献者:xerj-org 组织账户本身贡献 2742 次提交,Vinz2168(130 次)、buger(109 次)、thomas-villani(38 次)等多名活跃贡献者
  • 📬 Open Issues: 82
  • 🏷️ Topics: ai-search, ai-search-engine, bm25-search, elasticsearch, graph-search, hybrid-search, semantic-search, vector-database, vector-search 等
  • ✅ Elasticsearch 兼容性测试套件:每次提交都会跑一次,当前 1369 项测试里通过 1366 项,剩余差异在仓库里公开列出,没有藏起来

快速上手

一条命令安装

curl -fsSL https://xerj.org/get | sh

Windows PowerShell:

irm https://xerj.org/get.ps1 | iex

单一静态二进制,预编译支持 Linux、macOS、Windows 的 x86-64 和 arm64 架构,也可以从源码编译。

启动并索引第一个项目

xerj --insecure --data-dir ./data &              # 本地开发模式:无 TLS、无鉴权
xerj init                                        # 一条命令把 XERJ 接入 Claude Code / Cursor(MCP + skill)
xerj autoindex ~/my-project                      # 索引任意目录
xerj search "how do we rotate the WAL segment"   # 得到排序后的片段,带 file:line
xerj def "euler_to_rotationmatrix"               # 跳转到定义:file:line + 函数签名
xerj gain                                        # 查看它帮你省了多少(是统计出来的,不是估算)

关于 --insecure 这个标志需要特别说明:它关闭了 TLS 和 API Key 鉴权,意味着任何能连上这个端口的调用方都变成了超级用户,可以读取和删除每一个索引,包括每一个 /_memory 命名空间。这个标志的设计意图很明确——只给开发机上的单一用户用:全新节点默认只绑定 127.0.0.1,如果想绑定到其他网卡的明文模式,程序会直接拒绝启动,除非你显式允许。完整的安全模型写在 docs/SECURITY_MODEL.md 里。

用一句话让 Agent 自己装好

如果你的 Agent 支持执行终端命令,甚至不需要手动跑上面那些命令,直接把这句话丢给它:

Install XERJ (docs: https://xerj.org/llms.txt), index this project's sources, and set up
reference coding: clone and index the open-source repos closest to what we're building,
and search how they solved a problem before writing code.

这背后依赖的是 llms.txt——一份专门写给 Agent 看的结构化安装/使用步骤文档,这也是越来越多面向 AI Agent 的工具采用的约定。


核心剖析

参考式编码:让 Agent 先"抄"再写,而不是凭记忆硬编

XERJ 最主要、也是测量数据最充分的应用场景叫"参考式编码"(Reference Coding):给 Agent 一个任务,它会自动下载和这个任务最接近的开源仓库,索引它们,在动手写代码之前先查询"这些项目之前是怎么解决这个问题的",然后复用这个经验而不是凭模型记忆硬写。

项目给出了一组对照实验数据(8 个任务,4 种语言,每种方案跑 16 次,用真实的 claude -p 统计 Token):

方案输出 Token成本解决率
纯靠模型记忆260,916$11.1811/16
grep 驱动的 Agent26,477$3.2716/16
XERJ9,982$1.5816/16

同样达到 16/16 的解决率,XERJ 比 grep 驱动的方案省 2.7 倍输出 Token,比纯记忆方案省 26 倍,在单个 Java 任务上观察到最高 278 倍的差距。项目也诚实地指出了这个方案的边界:它的收益取决于模型"没记住"这段代码——对私有、内部、小众或模型知识截止日期之后的代码效果最好,但对模型本来就熟悉的热门公共库,收益会从"中性"滑向"没什么用"。这种明确标注适用边界、而不是无差别鼓吹效果的做法,在很多强调性能数字的项目里并不常见。

自动嗅探索引:零 Schema,吃进几十种文件格式

XERJ 的 autoindex 命令会对每个文件做类型嗅探,自动判断它是什么,并为发现的每个数据集创建一个独立索引——不需要你手写 Schema,也不需要配置 Pipeline:

phase A: 593 datasets inferred, 1955 junk/skipped files
phase B: indexing 25329 files with 8 workers
done in 158.1s, 593 datasets, 83103 records live, 790 junk records

代码文件通过 tree-sitter 解析,带着符号信息和行号进入索引,而不是被当成扁平文本——这意味着 Agent 查询时拿到的是"一个函数"而不是"一行命中"。支持的格式列表相当长:CSV、JSON、JSONL、XML、YAML、SQLite、PDF、DOCX、PowerPoint(每张幻灯片一条记录)、Excel(每个 Sheet 一个数据集)、EPUB(每章一条记录)、Jupyter Notebook(按标题分节)、man page、HTML、邮件(包括 Google Takeout 导出的 mbox)等。值得一提的是对 Unity 项目的特殊支持:文本序列化的场景、Prefab 和资源会变成"每个 GameObject/Component 一条记录",.meta 文件变成 GUID 到路径的映射表,MonoBehaviour 记录带着 script_class/script_path,让"哪些场景用了这个脚本"这种问题变成一次简单查询。

重新索引是增量式的:文件内容和上一次索引时字节级相同就直接跳过解析,复用之前的结果——日常"改几个文件再跑一次"的场景(CI 场景尤其典型)通常超过 95% 的内容没变化,总耗时的瓶颈变成哈希计算而不是解析本身。

为什么兼容 Elasticsearch API 而不是自造协议

XERJ 没有发明一套新的查询语言,而是直接实现了 Elasticsearch 的 REST API:索引、文档、批量操作、搜索、聚合、Mapping、kNN、Scroll、Reindex 以及 _cat 系列接口都覆盖了。这个选择的好处很直接——Kibana 和官方客户端库可以不加修改直接连上来,已经围绕 Elasticsearch 搭建的运维工具链不需要重写。

但项目也清楚地标注了协议层面的一处行为差异:Scroll 在 XERJ 里是一个有界的前置快照,不是逐段游走的游标——如果查询的真实命中总数超过了快照窗口,XERJ 会直接返回 400 拒绝请求,而不是悄悄截断结果。想要处理任意规模的结果集,需要换成 search_after。这种"宁可报错也不悄悄截断数据"的设计取向,配合每次提交都跑一遍的 1369 项兼容性测试(当前 1366 项通过,差异公开列在仓库里),体现了一种对"兼容"二字负责任的态度——不是号称兼容就完事,而是持续验证并公开差距。

此外项目还做了一次对标测试:和 Elasticsearch 8.13.4 在写入、全文搜索、聚合、向量搜索、高并发写入下的读取等多个维度正面比较,最新一轮结果是 55 胜 26 平 4 负,其中写入吞吐量 1.72 倍、磁盘占用缩小到 1.61 倍。4 次落败全部集中在同一个场景——高速写入时的读取 p99 延迟,项目专门写了一份复盘文档把这个短板讲清楚,而不是藏起来不提。


项目地址与资源


总结

XERJ 回答了一个在 AI Agent 大规模普及之后变得越来越尖锐的问题:当代码库大到一个 Agent 的上下文窗口根本装不下时,"读文件"这个最朴素的信息获取方式本身就已经不可行了,真正该解决的是让 Agent 查询确切需要的那一段,而不是优化读取速度。

三点值得注意:

"参考式编码"把 RAG 的思路具体落地成了一个可被测量的 Coding Agent 工作流,而不是一个抽象概念。 很多项目谈"检索增强"停留在原理层面,XERJ 给出了具体的对照实验数据(2.7 倍省 Token、同等解决率),并且诚实标注了这个方案在模型已经记住的热门公共库上效果会打折——这种"讲清楚什么时候真的有用"的态度,比单纯喊性能数字更值得信任。

选择兼容 Elasticsearch 协议而不是自造一套新接口,是一个务实到近乎保守的工程决定。 这意味着项目的护城河不在"发明新协议",而在"用更少的资源把一个已经被广泛集成的协议实现得足够好"——单一 Rust 二进制、无 JVM 依赖、1.72 倍写入吞吐量,这些收益直接叠加在一个用户已经熟悉的工具链之上,迁移成本接近于零。

对自身短板的公开披露(4 次基准测试落败、3 项未通过的兼容性测试、"该方案何时无效"的边界说明)贯穿了整个项目的文档风格。 这种"连负面结果都写清楚"的工程文化,在强调性能数字的项目里是比较少见的,也是判断一个项目的测试数据是否可信的重要信号。

如果你的 Coding Agent 经常在陌生代码库里被上下文窗口限制卡住,或者你正在为团队内部知识库搭建 RAG 系统却不想再多引入一套向量数据库,XERJ 这种"一个二进制、兼容现有协议、自动建索引"的思路值得认真试一试。


探索 PrimeSkills —— 精选 AI agent 和技能工具,每一个都经过真实工作流验证。没有炒作,只有真正好用的工具。

访问我的个人主页,获取更多见解和有趣的产品。