内容提要
团队发布了Postgres全文搜索扩展Lead,其功能与TIN相同,兼容SQL和TINQL查询,支持索引写入、ACID、快照隔离、持久化、BM25评分和高亮。但Lead速度慢,每次搜索都全表扫描,仅适合CI中小型表测试,生产环境仍应使用TIN。
延伸解读
Lead 的定位:为 CI 环境提供 TIN 兼容性
Lead 的推出是为了解决开发者在 CI 中无法运行 TIN 的问题。它提供了与 TIN 完全相同的功能集,包括相同的 SQL 语句和 TINQL 查询,确保搜索结果正确。这意味着开发者可以在 CI 中使用 Lead 进行测试,而无需修改代码,从而保持开发和生产环境的一致性。
性能取舍:全表扫描导致速度缓慢
Lead 的最大缺点是速度慢,每次搜索都会进行全表扫描。例如,8.0 GB 的 Wikipedia 语料库在 TIN 上可以达到 10,260 QPS,p99 为 2ms,而在 Lead 上每次查询需要四分钟。因此,Lead 仅适用于表大小在几 MB 以内的 CI 环境,官方建议将 CI 中的表保持在几 MB 以下。
功能完整性:ACID、持久化与高级搜索特性
尽管性能不佳,Lead 仍保留了 TIN 的所有功能特性。它支持 ACID 事务和快照隔离,确保在事务中插入的行对当前事务可见,而并发事务不可见,回滚后行消失。此外,它还支持持久化、BM25 评分(包括 tin.score 和 tin.max_score)以及 HTML 和 ANSI 格式的命中高亮。
使用建议:生产用 TIN,测试用 Lead
根据文章,开发者应在生产搜索应用中使用 TIN,而在测试、CI、开发和预发环境中使用 Lead。如果发现需要 Lead 更接近 TIN 的地方,可以通过支持票或 Discord 反馈。这种分工确保了生产环境的高性能,同时让 CI 能够验证功能正确性。
Q&A
Lead 是什么?它和 TIN 有什么关系?
Lead 是团队新发布的 Postgres 全文搜索扩展,功能与 TIN 相同,兼容所有相同的 SQL 语句和 TINQL 查询。但 Lead 速度慢,每次搜索都全表扫描,仅适合 CI 中小型表测试,生产环境仍应使用 TIN。
Lead 支持哪些功能?
Lead 支持与 TIN 相同的功能:正确的搜索结果(包括复杂 SQL 和 TINQL 查询)、相同的分词、索引写入(CREATE INDEX、INSERT、UPDATE、DELETE)、ACID 与快照隔离、持久化、BM25 评分(包括 tin.score 和 tin.max_score)以及高亮(HTML 和 ANSI)。
Lead 的性能如何?适合在什么场景下使用?
Lead 速度慢,每次搜索都是全表扫描。例如 8.0 GB 的 Wikipedia 语料库用 Lead 每次查询需四分钟,而 TIN 可达 10,260 QPS。建议 CI 中的表保持在几 MB 以下,Lead 表现尚可;非官方基准测试中,搜索《战争与和平》(3.4 MB,约五十万词)耗时 170ms。Lead 仅适合 CI、开发、测试和预发环境,生产环境应使用 TIN。
Lead 支持事务和持久化吗?
支持。Lead 是 ACID 的,具有正确的快照隔离:如果在事务中插入行,该事务内的 Lead 搜索能看到它们,而并发事务看不到;如果回滚,行会消失。Lead 也是持久化的,重启 Postgres 后数据仍然存在。
为什么需要 Lead?它解决了什么问题?
因为 TIN 无法在 CI 中运行,用户无法在 CI 中构建基于 TIN 的应用。Lead 作为 TIN 的兼容替代品,让开发者可以在 CI、开发、测试和预发环境中使用相同的功能集,从而解决 CI 环境下的全文搜索测试问题。
Lead 和 TIN 的主要区别是什么?
主要区别是速度:Lead 很慢,每次搜索都全表扫描,而 TIN 是快速的搜索索引扩展。Lead 保留了 TIN 的所有功能(如 SQL/TINQL 兼容、ACID、BM25、高亮等),但去掉了所有让 TIN 变快的部分。因此,生产环境应使用 TIN,而 CI、开发、测试和预发环境可使用 Lead。