字符串匹配的多列索引+与pg_trgm的字符串相似性?

时间:2014-02-05 21:58:35

标签: sql postgresql full-text-search trigram

提供此表:

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不是严格的全文,但无论如何我都在标记这个问题)

2 个答案:

答案 0 :(得分:7)

您可以使用组合不同类型的多列索引。

首先,添加您的案例中所需的两个扩展名:

CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;

pg_trgm允许您使用三元组索引,btree_gist允许您合并gistb-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)

我不明白为什么您的查询需要全文索引。