繁体   English   中英

使用加权 tsvector 用于 PostgreSQL 全文搜索的最佳索引

[英]Best index to use for PostgreSQL full text search with weighted tsvector

我是数据库的新手,对索引的工作方式没有把握。

我正在考虑对我的包含加权的 tsvector 的列进行索引(标题被赋予最大权重,然后是副标题,然后是段落内容)。 根据 Postgres 文档,GIN 是用于全文搜索的最佳选择,其次是 GiST。 但是第 12.9 章中有一个注释:

GIN 索引是首选的文本搜索索引类型。 作为倒排索引,它们包含每个单词(词素)的索引条目,以及匹配位置的压缩列表。 多词搜索可以找到第一个匹配项,然后使用索引删除缺少其他词的行。 GIN 索引仅存储 tsvector 值的单词(词素),而不存储它们的权重标签。 因此,在使用涉及权重的查询时需要重新检查表行。

这是否意味着 GIN 在我的用例中效率低下,我应该使用 GiST,还是它仍然是最好的使用? 我正在使用最新的 Postgres 版本 (12)。

不,你应该坚持使用 GIN 索引。

索引扫描充当过滤器,并有望消除大部分行,因此只有少数行需要重新检查。

无论如何,您可能必须获取表行,因此除非在索引扫描期间发现许多误报,否则不会有很多额外的工作。

最好的办法是在你的数据集上运行一些基准测试,这会给你一个权威的答案,哪个索引更适合你的情况。

要找出在位图堆扫描期间消除了多少误报,您可以检查查询的EXPLAIN (ANALYZE, BUFFERS)的输出。

tsvector 的 GiST 索引的实现是有损的,因此他们也需要查阅表格。 文档的那部分很奇怪,因为它似乎将 GIN 与 GiST 进行了对比,但 GIN 和 GiST 都不存储权重,因此没有什么可对比的。 (GiST 甚至不存储比权重少得多的值,只存储值的散列位)。

此外,权重仅在排名时使用,而不是在搜索时使用。

关于 tsvector 首选 GiST 的唯一时间是,如果您想要一个多列索引,您将对不同列的选择条件进行 AND 运算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM