【问题标题】:Best index to use for PostgreSQL full text search with weighted tsvector用于带加权 tsvector 的 PostgreSQL 全文搜索的最佳索引
【发布时间】:2020-02-13 00:05:07
【问题描述】:
我是数据库新手,对索引的工作原理并没有牢牢把握。
我正在研究索引 my 中包含加权 tsvector 的列(标题被赋予最大权重,然后是副标题,然后是段落内容)。根据 Postgres 文档,GIN 是最适合用于全文搜索的一种,其次是 GiST。但是在第 12.9 章中有一个注释:
GIN 索引是首选的文本搜索索引类型。作为倒置
索引,它们包含每个单词(词位)的索引条目,带有
匹配位置的压缩列表。多词搜索可以找到
第一个匹配,然后使用索引删除缺少的行
附加词。 GIN 索引只存储
tsvector 值,而不是它们的权重标签。因此表行重新检查
使用涉及权重的查询时需要。
这是否意味着 GIN 在我的用例中效率低下,我应该使用 GiST,还是它仍然是最好的?我正在使用最新的 Postgres 版本 (12)。
【问题讨论】:
标签:
database
postgresql
indexing
full-text-search
【解决方案1】:
不,你应该坚持使用 GIN 索引。
索引扫描充当过滤器,并有望消除大部分行,因此只有少数需要重新检查。
您可能无论如何都必须获取表行,因此除非在索引扫描期间发现许多误报,否则不会有很多额外的工作。
最好的办法是在您的数据集上运行一些基准测试,这会给您一个权威的答案,哪个索引更适合您的情况。
要了解在位图堆扫描期间消除了多少误报,您可以检查查询的 EXPLAIN (ANALYZE, BUFFERS) 输出。
【解决方案2】:
tsvector 的 GiST 索引的实现是有损的,所以他们也需要查阅表格。这部分文档很奇怪,因为它似乎将 GIN 与 GiST 进行对比,但 GIN 和 GiST 都没有存储权重,因此没有什么可对比的。 (GiST 甚至不存储值,更不用说权重,只是值的散列位)。
此外,权重仅在排名时使用,而不是在搜索时使用。
关于 tsvector 唯一首选 GiST 的情况是,如果您想要一个多列索引,您将在其中将不同列上的选择标准与在一起。