更正 Postgres 全文搜索索引

Correct Postgres full text search indexes

我正在创建一个多列全文搜索索引,目前我有这个 运行ning

CREATE INDEX products_search_document ON products
USING gin(to_tsvector('english', style_number || ' ' || brand || ' ' || style_description || ' ' || color));

这非常适合我正在使用的查询

SELECT * FROM "products"
WHERE (to_tsvector('english', style_number||' '||brand||' '||style_description||' '||color)
      @@ to_tsquery('english', 'G2000'))

我现在想使用前缀匹配,这样我的查询将如下所示:

SELECT * FROM "products"
WHERE (to_tsvector('english', style_number||' '||brand||' '||style_description||' '||color)
      @@ to_tsquery('english', 'G2000:*'))

当我在我的 Heroku postgres 实例上执行 运行 时,我得到的是 Seq Scan on products 而不是索引扫描。

在 Postgres 中使用前缀匹配器还需要什么其他索引?

你试过吗:

set enable_seqscan=off; 

然后 运行 你的查询,看看它是否使用它。我不明白为什么它不会。我怀疑计划者认为该特定搜索没有足够的特异性,因此认为顺序扫描比全文扫描更有效。

就是说,我认为对于前缀查询(在这种情况下你不会阻止等价性的出现,例如研究生和 postgres 被认为是等价的)btree text_pattern_ops,要点(gist_gtrgm_ops ) 或杜松子酒索引(我认为 spgist 可能不错,但还没有对此做任何指标)仅在连接值上,甚至(仅在 style_number 上)如果这就是您要添加的前缀,会更多效率高于全文。您的查询不会使用 tsvector,只会使用

style_number 喜欢 'G5000%'

style_number喜欢'G5000%'

并且您的索引将仅在 style_number 或连接值

如果您需要不区分大小写,请使用此处介绍的要点(gist_trgm_ops):http://www.postgresonline.com/journal/archives/212-PostgreSQL-9.1-Trigrams-teaching-LIKE-and-ILIKE-new-tricks.html

奇怪的是,我删除了索引并重新创建了它...这解决了问题。