XERJ 与 DocFetcher 文档搜索对比:面向 Agent 的本地搜索引擎 vs 面向人类的桌面 GUI
XERJ 与 DocFetcher 文档搜索对比:面向 Agent 的本地搜索引擎 vs 面向人类的桌面 GUI
DocFetcher 是一款成熟的开源桌面搜索 GUI,能读取 Outlook PST 邮件与多层嵌套压缩包,其便携版可把索引随身放在 U 盘上;XERJ 则是一个单二进制 Rust 搜索引擎,程序通过 HTTP(Elasticsearch 兼容 REST API)或 MCP 协议调用它,一条 xerj autoindex 命令即可把文档文件夹变成可检索、可被 Agent 引用的结构化数据。本文逐项对比两者的能力边界、给出可直接运行的 XERJ 操作命令,并说明各自最适合的使用场景。
TL;DR — DocFetcher 是给人在键盘前用的桌面 GUI;XERJ 是给程序(尤其是 AI Agent)调用的搜索服务。本文是能力对比(capability comparison),不是基准测试:未冻结共享语料、未安装 DocFetcher 与 XERJ 同场评测、未测量任何召回率、命中数或延迟,页面不给出任何"胜负计数"。
先说清楚:这篇对比没有跑基准
在进入细节之前,先明确本页的事实边界:
- 我们没有冻结一份共享语料库;
- 我们没有在 XERJ 旁边安装 DocFetcher 做同场评测;
- 我们没有测量召回率(recall)、命中数量(hit counts)或延迟(latency)。
本页没有任何"赢家计数"(win count),也没有任何一次运行(run)作为计数依据。关于 DocFetcher 的每一条陈述都来自其官方网站,关于 XERJ 的每一条陈述都是该二进制文件的可文档化能力(documented capability)。
如果你需要数字,正确做法是:用自己的文件夹在两个工具里分别建索引,自己对比两份结果列表——只有这种对比才描述得了你自己的文档。
Agent 提示词:把整条链路串起来
原文档为 AI Agent 提供了可直接使用的提示词模板,它描述了一条完整的"本地文档问答"工作流:启动节点 → 建索引 → 读数据地图 → 用短语查询并引用来源路径。
Act as a coding agent on a Windows or Linux workstation with a documents folder. Read https://xerj.org/llms.txt, start a local XERJ node, run xerj autoindex on the folder, read the data map, then answer the user question with a match_phrase query that cites the ax_path of every hit.
(在 Windows 或 Linux 工作站上充当编码 Agent,面对一个文档文件夹:阅读 llms.txt,启动本地 XERJ 节点,对文件夹运行 xerj autoindex,读取数据地图,然后用 match_phrase 查询回答用户问题,并为每个命中引用其 ax_path。)
这条提示词背后的每一步都可以用下面的四段命令落地。
四条命令:从索引到 Agent 查询的完整闭环
原文档给出了四条无需配置文件、无需 mapping 的完整命令,全部可以直接复制运行。
命令 1:索引文档文件夹
xerj autoindex ./Documents --url http://127.0.0.1:9200 --prefix docs --progress plain
要点:不需要任何配置文件,也不需要 mapping。xerj autoindex 会读取文件夹并按内容(content)识别每个文件的类型族(family),按文件形态推断数据集(dataset)并写入文档。--url 指定 Elasticsearch 兼容端点(默认 http://localhost:9200),--prefix docs 给索引加前缀(默认 ax),--progress plain 把进度输出为适合管道/CI/Agent 解析的固定两行格式(xerj-bar 展示行 + xerj-progress 机器行)。
从源码看,内容嗅探(content sniffing)是这条命令的核心:在 sniff.rs 中,模块头注释明确写着 "Content-based format detection. NEVER trusts file extensions"(基于内容的格式检测,绝不信任文件扩展名),检测顺序是 magic bytes → 二进制检查 → 文本启发式(json/jsonl → html/xml → logs → sql dump → csv → yaml → txt)。也就是说,一个扩展名写错的 CSV 文件仍然会落进类型化数据集,这正是"混合文件夹"场景的关键能力。
命令 2:打印数据地图
xerj autoindex map --url http://127.0.0.1:9200
打印数据地图,让下一条查询能指名真实的索引和真实的字段。Agent 先读地图,再写查询,就不会去猜字段名。地图数据来自 catalog 索引(autoindex-catalog)中每个数据集的 fields_json 字段——该字段携带 profiler 推断出的 FieldSpec 列表:字段名、es_type、基数估计、覆盖率、示例值等(见 map.rs 的模块文档)。命令行下加 --json 可输出原始 catalog 文档,供程序直接消费。
命令 3:短语查询并读取每个命中的文件路径
curl -s -XPOST http://127.0.0.1:9200/docs-*/_search -H 'content-type: application/json' -d '{"query":{"match_phrase":{"body":"purchase order"}},"size":10,"_source":["ax_path","ax_format","title"]}'
这条命令用通配索引模式 docs-* 覆盖所有以 docs 为前缀的索引,对 body 字段执行 match_phrase 短语匹配,并把 _source 投影到 ax_path(原始文件相对路径)、ax_format(检测出的格式)和 title 三个字段——每个命中都能被 Agent 引用到具体源文件。注意 catalog 的 GOTCHAS 提示(catalog.rs):查询全部数据应使用通配索引模式或逗号列表,不要用多索引别名;文档在运行结束时会做一次 refresh,新建写入需要先 _refresh 才能被搜索到。
命令 4:把同一节点暴露为 MCP 服务器
xerj mcp --url http://127.0.0.1:9200
把同一节点以 stdio MCP 服务器形式提供给 Agent。xerj mcp 与主二进制同在一个可执行文件里,无需单独安装。从 xerj-mcp 源码 看,它通过 stdio 传输(stdin/stdout 上的换行分隔 JSON-RPC 2.0)暴露 16 个工具,其中 13 个 1:1 映射到 XERJ 真实的 REST 接口,3 个 Corpus Hub 工具运行 xerj ask 流程。与本文主题直接相关的工具包括:xerj_search(POST /{index}/_search)、xerj_map(POST /autoindex-catalog/_search,即命令 2 的 MCP 形态)、xerj_memory_store / xerj_memory_recall(Agent 记忆读写)。每个工具都是薄代理(thin proxy):构造引擎本就接受的请求并转发,自身不增加任何能力。
认证方面:当目标为 loopback 地址且未显式提供 --auth/XERJ_AUTH 时,服务器会回退到本地节点自写的管理密钥(<data_dir>/admin.key),这正是 xerj init 一键初始化能直接工作的原因;对非 loopback URL 该回退永不触发,避免凭据泄露。
DocFetcher 是什么
DocFetcher 是一款 Eclipse Public License 许可的开源桌面搜索应用,支持 Windows、Linux 和 macOS。当前发布版本为 1.1.27,自 1.1.26 起无需单独安装 Java 运行时。
使用方式上,按文件夹建索引:GUI 基于索引作答,提供结果窗格(result pane)、预览窗格(preview pane)和命中高亮;过滤器可按文件大小、文件类型和位置收窄结果列表。查询语法是常见的布尔集合:支持通配符(wildcards)、短语搜索(phrase search)、模糊搜索(fuzzy search)、邻近搜索(proximity search)和权重提升(boosting)。
一个值得注意的设计决定:DocFetcher 默认什么都不索引——这是项目官方页面上的明确设计,由用户挑选文件夹而不是整盘索引。
XERJ 是什么
XERJ 是一个单一 Rust 二进制,运行一个搜索节点。xerj autoindex <folder> 读取文件夹并按内容识别每个文件类型族,按文件形态推断数据集并写入文档——命令不需要配置文件、不需要 mapping。
节点对外提供 Elasticsearch REST API。xerj autoindex map 打印"这个文件夹变成了什么"的数据地图,Agent 读地图后就能指名真实的索引和字段。xerj mcp 是同一二进制内的 stdio MCP 服务器,对已启动的节点提供 16 个工具;Agent 记忆存放在引擎的 /_memory/{namespace} 路径下(由 xerj_api 的 authz 中间件保护,authz.rs 可见 /_memory/{namespace}[/…] 的路由与权限表)。
XERJ 是单节点的:没有副本、没有故障转移(failover)。默认嵌入器是**词法特征哈希(lexical feature hashing)**而非神经模型,神经检索需通过 --embed-mode neural 显式开启。这一点在 xerj-ai 中体现为统一的 embedder 后端(lexical / proxy / Candle neural),其内置零配置确定性文本嵌入器即特征哈希;catalog 的 GOTCHAS 也注明:semantic_text 字段默认由内置词法特征哈希嵌入器(384 维混合词法+向量,非神经)在服务端嵌入。
能力逐项对比
以下每一行都是两个工具的文档化能力,没有一行是测量结果。
| 能力 | DocFetcher | XERJ |
|---|---|---|
| 带预览窗格的人工 GUI | 有,且命中高亮 | 无,仅 HTTP 与 MCP |
| Windows 桌面应用 | 有(Windows 7 SP1 及以上) | 服务进程,无窗口 |
| 索引可放 U 盘随身携带 | 有(portable 版本) | 数据在节点数据目录 |
| Outlook PST 邮件 | 有 | 无 PST 读取器;仅 mbox 与 .eml |
| zip、7z、rar、tar 压缩包 | 有,无限层嵌套 | 无压缩包处理 |
| 纯图像 PDF 的 OCR | 无 | 无 |
| 模糊与邻近操作符 | 有(查询语法内建) | 仅词项(terms)与短语(phrases) |
| 自动更新索引 | 有(应用运行期间) | 重跑 xerj autoindex |
| 格式检测 | 文件扩展名(另附正则选项) | 按内容逐族嗅探 |
| HTTP 查询 API | 免费版没有 | 有,Elasticsearch REST API |
| 面向 Agent 的 MCP 服务器 | 无 | 有,xerj mcp,16 个工具 |
| 被拒文件的目录清单 | GUI 内索引报告 | autoindex-catalog,每个文件一个原因 |
| 引擎内的 Agent 记忆 | 无 | 有,/_memory/{namespace} |
| 许可证 | Eclipse Public License | Apache-2.0 |
值得展开的几行:
- 被拒文件目录:XERJ 每次运行都会把
doc_kind: file的档案写入autoindex-catalog索引,携带status与reason(每个被拒/跳过文件一个原因,如"byte-identical content already indexed from …"),见 catalog.rs。这正是"这个文件夹到底索引了什么、为什么跳过某些文件"的可审计答案。 - 格式检测:XERJ 的检测顺序是 magic bytes → 二进制检查 → 文本启发式,检测出的 family 覆盖 JSONL/JSON/CSV/Logs/XML/HTML/YAML/PDF/EML/mbox/DOCX/PPTX/XLSX/XLS/DOC/EPUB/IPYNB/man/SQLite/SQL dump/源码/Unity 资源/BVH 等 30 余种(sniff.rs)。
- 自动更新索引:DocFetcher 在应用运行期间自动更新;XERJ 的常规方式是重跑
xerj autoindex(幂等、可恢复),此外--watch模式可在首轮索引后常驻并重索引变更文件。
什么时候该选 DocFetcher
- 当搜索的人是"人"时:DocFetcher 的 GUI 经过多年打磨,带预览窗格的结果窗口对人工阅读者胜过 API。
- 在 Windows 工作站上:它作为桌面应用安装,不需要终端、不需要节点、不需要 HTTP 调用。
- 当索引必须"随身携带"时:portable 版把索引放在应用文件夹内,整个文件夹可以放进 U 盘、加密卷或云盘。
- 面对 Outlook PST 文件时:XERJ 能读 mbox 和 .eml,但没有 PST、OST、Maildir 的读取器,仍留在 Outlook 自己存储里的邮件永远进不了 XERJ 索引。
- 面对压缩包时:DocFetcher 能无限层嵌套地遍历 zip、7z、rar、tar;XERJ 没有压缩包处理器。
- 当查询需要模糊或邻近操作符时:XERJ 只匹配词项和短语。
什么时候该选 Recoll 或 ripgrep-all
- 想要带邮件索引、OCR 钩子和 open-at-page 的桌面 GUI 时,选 Recoll——详见 Recoll 对比。
- 想"今天就一个问题、不要任何索引"时,选 ripgrep-all——详见 ripgrep-all 对比。
- 当文档必须分布在多个主机上时,选 Elasticsearch:XERJ 没有副本和故障转移,它只在一个节点上讲同样的 REST API。
什么时候 XERJ 更合适
- 当调用方是程序时:免费版 DocFetcher 是一个有窗口、没有 API 的应用;说 HTTP 或 MCP 的 Agent 无需任何包装就能调用 XERJ。
- 当搜索必须无桌面运行:XERJ 是服务进程,可在无头主机上运行并跨网络应答。
- 当文件夹是混合类型时:格式检测读内容而非扩展名,扩展名写错的 CSV 仍会落入类型化数据集。
- 当答案必须携带出处(provenance)时:每个文档都带
ax_path、ax_file、ax_format等关键词字段,Agent 可以引用源文件。源码证据上,def.rs 的代码检索默认_source即包含ax_path;byte-identical 重复路径只索引一次,规范记录保留全部当前文件名于_source.ax_paths(见 catalog GOTCHAS)。 - 当同一节点还要存放 Agent 记忆时:
/_memory/{namespace}把持久化的 Agent 记忆放在文档旁边。
XERJ 明确没有的东西
- 没有 GUI:没有结果窗口、没有预览窗格、没有词条高亮。
- 没有 OCR,没有压缩包处理器:邮件读取覆盖 mbox 与 .eml,不含 PST、OST 或 Maildir;没有基于角色的访问控制(RBAC),没有单点登录(SSO)。
- 单节点运行:没有故障转移,请按"从副本恢复"来规划。
如何正确阅读这篇对比
这是一份取自各自官方文档的能力对比,不是基准测试,也不是对你文件的断言。
诚实的总结很短:DocFetcher 是 Windows 上更好用的桌面应用,XERJ 是替你做搜索的程序所用的搜索引擎。 完整的 XERJ 侧实战可参考 文件夹搜索完整演练。
FAQ
在 Windows 上不用 Spotlight 如何搜索文档文件夹?
用你自己的工具给文件夹建索引。DocFetcher 为键盘前的人建索引;XERJ 为程序建索引,并通过 HTTP 或 MCP 应答。
DocFetcher 对比本地搜索 API?
DocFetcher 是免费版没有 API 的 GUI 应用。本地搜索 API 应答的是程序而非人——这正是对 Agent 而言最关键的区别。
如何一次性搜索一个同时包含 PDF、Word 和 markdown 的文件夹?
两个工具都能一次遍历建索引。DocFetcher 在结果窗口里展示命中;xerj autoindex 写出类型化文档,再由 match_phrase 查询通过 HTTP 读取。
你们有没有跑 XERJ 与 DocFetcher 的正面基准?
没有。没有冻结共享语料,没有测量召回率或时序数字,所以本页只发布文档化能力,不发布任何胜负计数。
哪个工具能把索引放在 U 盘上?
DocFetcher。portable 版把索引放在应用文件夹内,被索引的资料随盘携带;XERJ 的数据存放在节点数据目录。
Agent 能直接调用 DocFetcher 吗?
免费桌面版不行——它有 GUI 且没有 API。多用户 Web 界面是单独销售的 DocFetcher Server。
相关阅读
- 我有一个包含 PDF、Word 和 markdown 的文件夹,如何一次性全部搜索?
- 如何搜索一个 .docx 合同文件夹?
- ChatGPT 能搜索我笔记本电脑上的文件夹吗,还是需要别的工具?
- 本地桌面搜索 PDF 和文档文件夹,哪家最强?
- 如何从命令行 grep PDF 和 Word 文档?