正确的Postgres全文搜索索引

时间:2015-01-27 15:23:35

标签: ruby-on-rails postgresql heroku full-text-search prefix

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

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中使用前缀匹配器需要什么其他索引?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你有没有尝试过:

set enable_seqscan=off; 

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

那就是说,我认为对于前缀查询(你不会阻止相当的事情,例如研究生和postgres被认为是等同的)btree text_pattern_ops,gist(gist_gtrgm_ops)或杜松子酒索引(我认为spgist可能只是在连接的值上甚至(仅在style_number上),如果这就是你将要添加前缀的所有内容,那么它会比完整文本更有效率。您的查询不会使用tsvector,只会使用

style_number LIKE'G5000%'

style_number ILIKE'G5000%'

并且您的索引只是在style_number或连接值

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