免费 DocFetcher 替代方案怎么选:XERJ 作为可被 Agent 调用的文档搜索引擎对比分析
免费 DocFetcher 替代方案怎么选:XERJ 作为可被 Agent 调用的文档搜索引擎对比分析
DocFetcher 是成熟的桌面搜索 GUI,而 XERJ 是一个单二进制文件即可运行的搜索节点,通过 HTTP 与 MCP 协议对外提供检索能力。本文以 XERJ 与 DocFetcher 的能力对比为核心,说明两者在索引、查询、便携性、Agent 可调用性上的本质差异,并给出 xerj autoindex、xerj autoindex map、match_phrase 查询与 xerj mcp 的完整实战命令,帮助你判断免费文档搜索工具究竟该选"给人用的桌面软件"还是"给程序调用的搜索引擎"。
关于本对比的诚实声明:本文没有跑过任何基准测试。我们没有冻结共享语料库,没有在 DocFetcher 旁边安装 XERJ,没有测量召回率、命中数或延迟。页面上的每一行都是"已记录的能力",不是"测出来的结果",因此不存在任何胜负数字。如果你想获得针对自己文档的答案,请用两个工具分别索引你自己的文件夹、对比两份结果列表——那才是唯一能描述你文档的对比方式。
DocFetcher 是什么
DocFetcher 是一款采用 Eclipse Public License 的开源桌面搜索应用,支持 Windows、Linux 和 macOS。当前发布版本为 1.1.27,自 1.1.26 起不再需要单独安装 Java 运行时(Windows 7 SP1 或更高、Linux 需 GTK3、macOS 11 或更高)。
它的使用方式是为每个文件夹创建一个索引,然后由 GUI 基于该索引回答问题,提供结果窗格、预览窗格与高亮匹配。过滤器可以按文件大小、文件类型和位置缩小结果列表。查询语法是常见的布尔集合,支持通配符、短语搜索、模糊搜索、邻近搜索(proximity search)与加权(boosting)。
值得注意的设计决策是:DocFetcher 默认不索引任何东西。这是项目官方页面上的立场——由用户自己选择要索引的文件夹,而不是整块磁盘。另外,多用户的 Web 界面以 DocFetcher Server 的形式单独出售,免费桌面应用本身没有这类接口。
XERJ 是什么
XERJ 是一个单一的 Rust 二进制文件,运行一个搜索节点。核心流程是:
xerj autoindex <folder>读取文件夹,按内容而非文件扩展名识别每个文件所属的族(family),为每种文件形态推断一个数据集(dataset),并把文档写入节点——命令不需要配置文件,也不需要 mapping;xerj autoindex map打印"数据地图",说明文件夹变成了哪些索引、哪些字段,Agent 先读地图、再写出指向真实索引与真实字段的查询;- 节点对外提供 Elasticsearch 兼容的 REST API,现有 ES 客户端可以直接对接;
xerj mcp在同一个二进制内以 stdio MCP 服务器方式把这些能力暴露给 Agent。
XERJ 是单节点部署:没有复制、没有故障转移。默认的嵌入器是词法特征哈希(lexical feature hashing),不是神经网络模型;神经检索需要通过 --embed-mode neural 显式开启。
从源码看 XERJ 的能力落地
上述能力并非宣传语,在仓库中有完整的实现对应:
xerj autoindex的参数解析在 engine/crates/xerj-autoindex/src/cli.rs,支持--url、--prefix、--progress、--dry-run、--workers、--max-file-mb、--watch等运行时选项;- 内容嗅探与多格式解析在 engine/crates/xerj-autoindex/src/extract/ 目录,包含 PDF(
pdf.rs)、DOCX(docx.rs)、CSV(csv_x.rs)、JSON/JSONL、XML、YAML、HTML、SQLite(sqlite_x.rs)、SQL 文本(sqldump.rs)、日志(logs.rs)、纯文本(txt.rs)、邮件(eml.rs、mbox.rs)、代码(code.rs)等解析器——这印证了文档中"按内容检测格式"的描述; - MCP 服务器的工具清单在 engine/crates/xerj-mcp/src/lib.rs。该文档最初发布时描述为 10 个工具;从当前源码看,工具列表已扩展为 16 个,其中 13 个直接 1:1 映射到 XERJ 真实的 REST 接口(
xerj_search、xerj_semantic_search、xerj_vector_search、xerj_hybrid_search、xerj_memory_store、xerj_memory_recall、xerj_brain_*、xerj_map、xerj_code_search、xerj_plan等),另 3 个xerj_hub_*工具执行xerj ask流程; - Agent 记忆接口实现在 engine/crates/xerj-api/src/memory_api.rs:
/_memory/{namespace}的每个命名空间由保留索引.xerj-memory-{namespace}支撑,存储与召回复用与文档完全相同的引擎路径。
能力对比,逐行对照
下表每一行都是每个工具"已记录的能力",没有任何一行是实测结果。
| 能力 | DocFetcher | XERJ |
|---|---|---|
| 带预览窗格的人机 GUI | 有,匹配高亮 | 无,仅 HTTP 与 MCP |
| Windows 桌面应用 | 有,Windows 7 SP1 及以上 | 服务器进程,无窗口 |
| U 盘便携索引 | 有,portable 版本 | 数据位于节点数据目录 |
| Outlook PST 邮件 | 有 | 无 PST 读取器;仅 mbox 与 .eml |
| zip、7z、rar、tar 归档 | 有,嵌套无上限 | 无归档处理器 |
| 纯图片 PDF 的 OCR | 无 | 无 |
| 模糊与邻近操作符 | 有,在查询语法中 | 词项与短语 |
| 自动索引更新 | 有,应用运行期间 | 重新运行 xerj autoindex |
| 格式检测 | 文件扩展名,带正则选项 | 按族进行内容嗅探 |
| HTTP 查询 API | 免费应用中没有 | 有,Elasticsearch REST API |
| 供 Agent 使用的 MCP 服务器 | 无 | 有,xerj mcp,多工具 |
| 被拒绝文件的清单 | GUI 中的索引报告 | autoindex-catalog,每个文件一个原因 |
| 引擎内的 Agent 记忆 | 无 | 有,/_memory/{namespace} |
| 许可证 | Eclipse Public License | Apache-2.0 |
什么时候应该选 DocFetcher
当执行搜索的是"人"时。 DocFetcher 的 GUI 经过多年打磨,带结果窗口和预览窗格,对人类读者来说比一个 API 友好得多。
在 Windows 工作站上。 它作为桌面应用安装,不需要终端、不需要节点进程、不需要 HTTP 调用。
当索引必须"随身携带"时。 portable 版本把索引放在应用文件夹内,整个文件夹可以放在 U 盘、加密卷或云盘上随行。
当数据在 Outlook PST 文件中时。 XERJ 能读 mbox 与 .eml,但没有 PST、OST 或 Maildir 的读取器——仍留在 Outlook 自有存储中的邮件永远进不了 XERJ 索引。这一限制与源码一致:engine/crates/xerj-autoindex/src/extract/ 下的邮件解析器只有 eml.rs 与 mbox.rs。
当需要处理归档文件时。 DocFetcher 能遍历 zip、7z、rar、tar 且嵌套无上限;XERJ 目前没有归档处理器。
当查询需要模糊或邻近操作符时。 XERJ 匹配词项和短语。
什么时候应该选 Recoll 或 ripgrep-all 替代
选 Recoll:当你要桌面 GUI、邮件索引、OCR 钩子和"打开到页面"能力时。这一权衡详见 Recoll 对比文章。
选 ripgrep-all:当你只需要回答"一个问题、今天就要、完全不要索引"时。它包装 ripgrep,为 PDF、Office 文档、归档和 SQLite 提供适配器。这一权衡详见 ripgrep-all 对比文章。
选 Elasticsearch:当文档必须分布在多台主机上时。XERJ 没有复制和故障转移,它只在单节点上说同一种 REST API。
什么时候 XERJ 是更合适的方案
当调用方是程序时。 免费的 DocFetcher 应用有窗口而没有 API;会讲 HTTP 或 MCP 的 Agent 可以直接调用 XERJ,无需任何包装层。
当搜索必须跑在无桌面环境时。 二进制是一个服务器进程,可以在无头主机上运行并通过网络应答。
当文件夹是混合类型时。 格式检测读的是内容而不是扩展名——一个扩展名写错的 CSV 文件照样落进带类型的数据集。
当答案必须携带出处(provenance)时。 每份文档都带有 ax_path、ax_file、ax_format 等关键字字段,Agent 可以据此引用源文件。
当同一个节点还想承载 Agent 记忆时。 /_memory/{namespace} 把持久化的 Agent 记忆放在文档旁边。
实战:用 XERJ 索引一个文档文件夹并回答短语问题
以下命令来自本文档的原始操作清单,可在 Windows 或 Linux 工作站的文档文件夹上原样执行。
第 1 步:索引文件夹。 一条命令完成全部工作,不需要配置文件、不需要 mapping:
xerj autoindex ./Documents --url http://127.0.0.1:9200 --prefix docs --progress plain
从 engine/crates/xerj-autoindex/src/cli.rs 的参数结构看,--url 指向已启动的节点,--prefix 决定生成的索引名前缀,--progress plain 让进度以纯文本输出;对于大文件夹,还可以先加 --dry-run 只打印任务规模与计划数据集而不写入任何内容,再决定是否真正执行。
第 2 步:读取数据地图。 让下一条查询能写出真实存在的索引名和字段名:
xerj autoindex map --url http://127.0.0.1:9200
第 3 步:用短语查询回答问题。 通过 HTTP 发送 match_phrase 查询,并从每条命中里读出文件路径:
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"]}'
第 4 步:把同一个节点开放给 Agent。 作为 stdio MCP 服务器启动:
xerj mcp --url http://127.0.0.1:9200
MCP 服务器的实现细节可继续阅读 engine/crates/xerj-mcp/src/lib.rs:它通过 stdio 传输讲换行分隔的 JSON-RPC 2.0,所有工具都是"薄代理"——构造引擎本来就接受的请求并转发到可配置的 base URL,自身不增加任何能力;诊断信息走 stderr,stdout 只保留给 JSON-RPC 流。如果目标地址是回环地址且未显式提供认证,服务器会回退到本地节点为自身写入的管理员密钥(<data_dir>/admin.key),这与 xerj autoindex 的本地密钥发现逻辑一致,也是"零配置启动"能直接工作的原因。
XERJ 没有的东西
XERJ 没有 GUI:没有结果窗口、没有预览窗格、没有词条高亮。
XERJ 没有 OCR,也没有归档处理器。邮件读取覆盖 mbox 与 .eml,不覆盖 PST、OST 或 Maildir。它没有基于角色的访问控制,也没有单点登录。
XERJ 运行在单个节点上,没有故障转移。请为"从副本恢复"做好规划。
更完整的检索场景参考
- 如何一次性搜索文件夹里的 PDF、Word 与 Markdown:完整演示一次 6 文件运行如何把混合格式变成 2 个索引、51 条记录,以及
match_phrase如何在 HTML、JSON、Markdown 三种格式中同时命中同一短语; - 如何搜索 Word 文档文件夹:文档类格式的专项说明;
- 给 ChatGPT / Claude 本地文件访问权:通过 MCP 把同一节点暴露给外部 Agent;
- 用 autoindex map 记录被拒绝的文件:
autoindex-catalog中每个被拒文件都带status=junk与原因字符串; - XERJ 如何自动索引一个文件夹:底层检测与推断流程的逐步讲解。
如何阅读本文
这是一份基于两个工具各自官方文档的能力对比,不是基准测试,也不是对你文件的断言。诚实的总结很短:DocFetcher 是给 Windows 上的"人"用的更好的桌面应用;XERJ 是替你做搜索的"程序"所用的搜索引擎。 完整的 XERJ 侧实战走查见文件夹搜索教程。