2016年,从东京飞往巴黎的航班上,一个前端工程师读完了Rust语言手册。他没想到,这次消遣会催生一个让Apache Lucene——这个统治全文搜索20年的巨头——主动放下身段寻求合作的开源项目。

这个人叫Paul Masurel。当时他在Indeed日本做搜索质量优化,每天和Lucene 2.4打交道。 frustration(挫败感)是他反复提到的词:「长期发酵的挫败感是一种被低估的驱动力。」

他不是后端出身,却被排除在核心团队之外。这种边缘位置的焦虑,最终推着他写出了Tantivy。

「有点傻」的初版,和Lucene没打算做的那些事

「有点傻」的初版,和Lucene没打算做的那些事

第一个版本只花了两个月业余时间。Paul自己评价:「有点傻。」但核心架构已经定调——模块化、内存安全、单文件可理解。

Rust确实影响了代码组织方式,但架构灵感完全来自Lucene。Paul坦承这一点,甚至带着敬意:Lucene的倒排索引设计、段合并策略、查询解析逻辑,都是教科书级别的实现。

区别在于,Lucene用Java写了20年,功能堆叠到连贡献者都怕改坏;Tantivy从Day 1就拒绝成为黑箱。

Paul的设计哲学很产品经理:开发者应该能「拥有」自己的搜索基础设施。不是调参调一年,而是读一遍源码就能知道瓶颈在哪。这个定位意外切中了云原生时代的痛点——当Elasticsearch集群的内存账单开始杀人时,人们突然想要一个轻量、可嵌入、能用Rust生态重新编译的选项。

2017年开源后,Tantivy的增长曲线很「Rust」:前三年几乎只有硬核开发者在用,2020年后随着Quickwit、ParadeDB、LNX等产品基于它构建,才开始进入主流视野。Paul在2020年联合创立Quickwit,把Tantivy包装成云原生日志搜索引擎,2024年被Datadog收购——这笔交易让他从开源作者变成了大厂基础设施负责人。

Lucene团队找上门:一场意外的性能合作

Lucene团队找上门:一场意外的性能合作

最戏剧性的转折发生在2023年。Lucene核心开发者Adrien Grand主动联系Paul,讨论双方在性能优化上的合作可能。

竞争关系是明摆着的:Tantivy在特定场景下比Lucene快2-5倍,内存占用低一个数量级,而且天生支持无状态分布式架构。但Paul的描述很克制:「我们不是在取代Lucene,是在探索搜索引擎的另一种可能。」

合作的具体形式是代码层面的互相借鉴——Lucene团队研究了Tantivy的SIMD优化和压缩算法,Tantivy则参考了Lucene在并发控制上的成熟经验。

这种「竞合」在开源世界并不常见。通常要么彻底 fork 对立(如OpenSearch vs Elasticsearch),要么一方被收购后雪藏。Lucene选择主动接触,某种程度上承认了Tantivy的技术合法性:一个单枪匹马的Rust项目,真的在核心性能指标上做出了值得学习的东西。

Paul的解读更务实:搜索基础设施的复杂度已经超出任何单一团队能完全掌控的范围。Lucene的Java生态和Tantivy的Rust生态,面对的是不同约束条件下的优化问题——前者要兼容20年历史包袱,后者可以大胆假设现代硬件特性。

从「测试Rust理解」到Datadog基础设施:产品经理的意外路径

回看整个轨迹,Paul的身份转换很有意思。他从来不是典型的系统工程师出身——前端→搜索质量优化→后端→开源作者→创业者→大厂基础设施负责人。每一步都带着「边缘人」的视角:因为不在核心团队,所以更在意可理解性;因为不是Rust专家,所以更谨慎地选择语言特性;因为资源有限,所以被迫做减法。

这种路径依赖塑造了Tantivy的DNA。比如它的查询语言设计明显偏向「显式优于隐式」——没有Elasticsearch那种自动猜测用户意图的魔法,但调试时你能精确知道每个毫秒花在哪。Paul把这称为「系统性的诚实」:不假装搜索是魔法,把复杂度摊开在用户面前。

被Datadog收购后,Paul的工作场景从「一个人维护开源项目」变成了「支撑每天处理PB级日志的搜索集群」。压力维度完全不同,但他发现Tantivy的架构选择意外耐操——无状态设计让水平扩展变成纯数学问题,内存安全消除了凌晨三点被OOM杀进程的可能性。

当然,代价也很真实。Rust的学习曲线让贡献者门槛远高于Java;生态系统成熟度差距意味着某些功能必须自己造轮子;而「模块化」的承诺在快速迭代中偶尔会妥协——Paul承认有些内部接口设计得「过于灵活」,反而增加了理解成本。

搜索基础设施的下一个战场在哪

搜索基础设施的下一个战场在哪

Paul现在的工作重心是向量搜索(vector search)与稠密检索(dense retrieval)的整合。这是Tantivy 0.22版本的重点,也是整个搜索领域的热战场——关键词匹配和语义理解的融合,正在重新定义「相关性」的含义。

他的判断很直接:纯向量数据库和纯倒排索引都会存在,但中间地带的混合方案会是主流。Tantivy的选择是原生支持HNSW索引,同时保持与现有文本索引的联合查询能力——不是外包给另一个服务,而是在同一进程内完成。

这个技术判断背后,还是那个产品经理直觉:用户不想管理两套基础设施。日志搜索和语义搜索的查询模式差异巨大,但运维团队只想看一个仪表盘。

至于Tantivy与Lucene的关系,Paul的表述很平静:「我们证明了用Rust重写搜索核心是值得的,但Lucene证明了用Java维护20年搜索核心也是可能的。两条路都成立,取决于你的约束条件。」

2024年Datadog收购Quickwit时,有开发者担心Tantivy会转向闭源。Paul的回应是继续发布版本,并扩大了核心维护者团队——现在有三个全职贡献者,以及一个越来越活跃的PR队列。

那个在长途航班上读完Rust手册的前端工程师,大概没想到七年后会坐在纽约的办公室里,和曾经仰望的Lucene开发者讨论下一版压缩算法的细节。当被问到「如果重来一次会做什么不同」时,Paul说:「可能会更早接受别人的帮助。一个人写代码很爽,但瓶颈来得比预期快。」

现在Tantivy的GitHub仓库有1.4万星,依赖它的生产系统每天处理着数十亿次查询。而Paul最新的一条推文是:「刚发现某个内部服务的查询延迟P99从200ms降到12ms,原因是升级到了Tantivy 0.21。这种反馈比任何benchmark都管用。」

如果你正在维护一个搜索系统,最近一次让你想重写它的挫败感是什么时候开始的?