我正在创建一个多列全文搜索索引,目前我正在运行
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中使用前缀匹配器需要什么其他索引?
答案 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