内容提要
PlanetScale发布Postgres全文搜索扩展TIN,宣称性能超越ParadeDB。ParadeDB通过优化字段范数存储、采用MAXSCORE算法等缩小差距并反超。文章指出TIN的ctid标识符并非关键,其常用词省略会降低BM25准确性。ParadeDB坚持基于Tantivy,相关优化已开源。
延伸解读
性能差距的根源:文档标识符并非关键
TIN 宣称其性能优势源于直接使用 Postgres 的 ctid 作为文档标识符,从而省去了映射开销。但 ParadeDB 通过优化字段范数存储和采用 MAXSCORE 算法,在不改变文档标识符的情况下实现了反超。这表明 ctid 并非性能的决定性因素,真正的瓶颈在于数据局部性和算法选择。读者应关注具体优化手段,而非盲目相信架构宣传。
常用词省略:速度与准确性的权衡
TIN 的 dense-term elision 在查询时跳过高频词的评分,以提升速度,但会偏离精确 BM25 排序。在 StackExchange 基准中,近半数查询的 Top 10 结果与真实排序不符,析取查询中错误率高达 88.2%。虽然省略低权重词通常影响不大,但当查询全由常用词组成时,结果可能完全错误。是否启用需根据实际场景权衡。
基准测试的公平性:配置差异不容忽视
PlanetScale 的基准测试存在两处无意偏袒 TIN 的配置:ParadeDB 查询未限定字段,导致搜索了更多列;TIN 默认启用常用词省略,而 ParadeDB 未启用停用词。调整后,ParadeDB 在精确 BM25 下吞吐量反超 TIN。这提醒读者,性能对比需关注测试条件是否对等,否则结论可能失真。
Tantivy 与自研引擎:生态与性能的取舍
ParadeDB 坚持基于 Tantivy,因其经过十余年发展和大规模生产验证,且易于扩展。TIN 选择自研引擎,虽在 BM25 评分上表现出色,但缺乏列式存储等完整搜索能力。ParadeDB 认为,若 TIN 要支持排序、过滤、分面等高级功能,仍需解决 ctid 与列式存储的映射问题。选择成熟生态还是完全自控,是工程团队需要权衡的长期决策。
Q&A
PlanetScale 发布的 TIN 是什么?它和 ParadeDB 有什么关系?
TIN 是 PlanetScale 为 Postgres 发布的一款全文搜索扩展。它的发布宣称在 BM25 排序文本搜索和文档计数方面性能超越了 ParadeDB 的部分功能。ParadeDB 对此进行了回应,并通过优化缩小了差距甚至反超。
ParadeDB 是如何在 BM25 Top K 查询上缩小与 TIN 的性能差距的?
ParadeDB 通过两项主要优化:1) 将字段范数(fieldnorms)数组与每个词项的倒排列表一起存储,使评分时能顺序读取,将字段范数页面访问从约 1500 次降至 30 次;2) 为多词项析取查询实现 MAXSCORE 路径,并采用启发式选择算法(至少三个词项且倒排列表足够密集时用 MAXSCORE,否则用 WAND),从而大幅降低延迟。
TIN 声称使用 ctid 作为文档标识符是性能优势的关键,ParadeDB 对此有何看法?
ParadeDB 认为 ctid 并非关键。他们通过不改变文档标识符(仍使用 u32 DocId)的优化就缩小了差距。ctid 是 48 位物理位置标识,不如密集、排序、唯一的 u32 整数压缩效率高,且不利于连接列式存储,而列式存储对于 Top K 排序、范围过滤和分面等搜索功能至关重要。
TIN 的常用词省略(dense-term elision)是什么?它有什么潜在问题?
TIN 在查询时跳过对出现频率超过语料库 10%(可通过 dense_ratio 配置)的词项进行评分,以加速查询。但这会计算近似的 BM25 分数,可能导致结果排序与真实 BM25 不同。在 StackExchange 基准测试中,启用省略后,47.8% 的查询返回的 Top 10 结果中至少有一个不在真实 Top 10 中,析取查询中这一比例高达 88.2%。
ParadeDB 为什么坚持基于 Tantivy 构建而不是自研搜索引擎?
ParadeDB 认为 Tantivy 经过十多年发展和全球大公司的实战测试,速度卓越,且具有可扩展性。虽然 Tantivy 与 Postgres 块布局不完全匹配,但其优势远超不足。此次优化大多在 Tantivy 中完成,并已开始向上游贡献改进。
ParadeDB 在基准测试配置上发现了哪些对 TIN 有利的不公平之处?
发现两个问题:1) ParadeDB 查询未指定字段名,导致默认搜索所有索引文本字段,而 TIN 只搜索一个字段,使 ParadeDB 处于劣势;2) TIN 启用了常用词省略,而 ParadeDB 计算精确 BM25,导致在由常见词组成的查询上 TIN 大幅领先。ParadeDB 调整了查询语法并对比了不同配置下的结果。