内容提要
TIN v1.0.6 发布,速度提升 2-3 倍,新增 18 种语言的词干提取支持,并优化 top-k 查询的并列排序。基准测试显示,TIN 在 x86-64 和 ARM64 上的吞吐量比 ParadeDB 高 3-5 倍,延迟低 2-4 倍,重夺最快 Postgres 全文索引地位。
延伸解读
词干提取:多语言搜索的增强与索引重建
TIN v1.0.6 新增了基于 Snowball 算法的词干提取功能,支持包括中文在内的 18 种语言。词干提取将单词映射到词干形式,使查询能匹配同一词干的不同变体,提升召回率。但启用该功能需要重建索引,且必须先将 TIN 升级到至少 v1.0.4。重建时需使用 CREATE INDEX CONCURRENTLY 并指定 stemmer 参数,以避免阻塞写入。
并列排序优化:确定性排序的性能提升
对于 top-k 查询中分数相同的行,用户常需按插入时间或主键等附加列进行确定性排序。此前,这类查询无法利用块最大算法,必须识别并评分所有匹配文档,导致性能下降。v1.0.6 将块最大计划应用于带并列排序的查询,使其性能与普通 top-k 查询相当,提升了此类场景的响应速度。
基准测试解读:TIN 重夺性能领先
在 85 GB Stack Exchange 语料库上的基准测试显示,TIN v1.0.6 在 x86-64 和 ARM64 上的吞吐量比 ParadeDB 高 3-5 倍,延迟低 2-4 倍。测试涵盖合取、析取、短语及混合查询,均请求按 BM25 分数排序的前十结果。TIN 默认配置省略高频词评分,若需完整评分可使用 tin.full_score,性能仍优于 ParadeDB。
评分策略与索引维护:权衡与注意事项
TIN 默认从 BM25 评分中省略出现频率超过 10% 的常见词,以节省 CPU 时间,但索引和搜索逻辑仍包含这些词。用户可通过 tin.full_score 或调整 dense_ratio 参数改变评分行为。与 ParadeDB 0.26.0 优化导致索引增大 29% 且需重建不同,TIN v1.0.6 索引格式未变,可直接替换,无需额外操作。
Q&A
TIN v1.0.6 主要更新了哪些功能?
TIN v1.0.6 主要更新包括:速度提升 2-3 倍,新增对 18 种语言的词干提取(stemming)支持,并优化了 top-k 查询的并列排序(tiebreakers)。
TIN 支持哪些语言的词干提取?
TIN 使用 rust_stemmers crate,支持 18 种语言:阿拉伯语、亚美尼亚语、丹麦语、荷兰语、英语、法语、德语、希腊语、匈牙利语、意大利语、挪威语、葡萄牙语、罗马尼亚语、俄语、西班牙语、瑞典语、泰米尔语和土耳其语。
如何启用 TIN 的词干提取功能?
首先将 TIN 更新到至少 v1.0.4,然后重建索引。例如:ALTER EXTENSION tin UPDATE; CREATE INDEX CONCURRENTLY new_idx_name ON some_table USING tin(some_column) WITH (stemmer = 'en'); DROP INDEX CONCURRENTLY old_idx_name;
TIN v1.0.6 在性能基准测试中表现如何?
在 x86-64 上,TIN 默认配置的吞吐量比 ParadeDB 高 3.1-5.0 倍,p99 延迟低 2.7-4.4 倍;在 ARM64 上,吞吐量高 3.1-4.2 倍,延迟低 2.1-3.0 倍。使用 tin.full_score 时,x86-64 吞吐量高 1.3-3.0 倍,延迟低 1.6-2.2 倍;ARM64 吞吐量高 1.3-2.4 倍,延迟低 1.2-1.7 倍。
TIN 的默认评分会忽略常见词吗?可以调整吗?
是的,TIN 默认会从 BM25 评分中忽略出现在超过 10% 文档中的词。可以通过查询时使用 tin.full_score(ctid) 来包含所有词,或使用 tin.score(ctid, dense_ratio => F) 自定义阈值 F(0 到 1 之间)。
TIN v1.0.6 升级需要重建索引吗?
不需要。TIN v1.0.6 是直接替换(drop-in replacement),索引格式没有改变或增大,客户无需采取任何操作。但若要使用词干提取功能,则需要重建索引。