提供此表:
foos
integer id
string name
string type
这样的查询:
select * from foos where name ilike '%bar%'
我可以像这样pg_trgm index来更快地进行查找:
CREATE INDEX ON foos USING gin (name gin_trgm_ops)
(右?)
我的问题:这样的查询怎么样:
select * from foos where name ilike '%bar%' AND type = 'baz'
我可以创建一个有助于查找两列的索引吗?
(我知道trigram不是严格的全文,但无论如何我都在标记这个问题)
答案 0 :(得分:7)
您可以使用组合不同类型的多列索引。
首先,添加您的案例中所需的两个扩展名:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;
pg_trgm允许您使用三元组索引,btree_gist允许您合并gist
和b-tree
索引,这就是您想要的!
对于像这样的查询:
SELECT * FROM foo WHERE type = 'baz' AND name ilike '%bar%';
您现在可以创建如下索引:
CREATE INDEX ON foo USING gist (type, name gist_trgm_ops);
像往常一样,查询和索引之间的列顺序必须相同。
答案 1 :(得分:0)
使用综合索引:
CREATE INDEX ON foos(name, type)
但是,您可能需要:
CREATE INDEX ON foos(lower(name), type)
我不明白为什么您的查询需要全文索引。