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

Joh*_*hir 6 sql postgresql full-text-search trigram

给这个表:

foos
integer id
string name
string type
Run Code Online (Sandbox Code Playgroud)

和这样的查询:

select * from foos where name ilike '%bar%'
Run Code Online (Sandbox Code Playgroud)

我可以像这样制作一个pg_trgm索引,以便更快地进行查找:

CREATE INDEX ON foos USING gin (name gin_trgm_ops)
Run Code Online (Sandbox Code Playgroud)

(对?)

我的问题:这样的查询怎么样:

select * from foos where name ilike '%bar%' AND type = 'baz'
Run Code Online (Sandbox Code Playgroud)

我可以创建一个有助于查找两列的索引吗?

(我知道trigram不是严格的全文,但我正在这样标记这个问题)

pid*_*uis 7

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

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

CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;
Run Code Online (Sandbox Code Playgroud)

pg_trgm允许你使用trigram索引,btree_gist允许你组合gistb-tree索引,这就是你想要的!

对于像这样的查询:

SELECT * FROM foo WHERE type = 'baz' AND name ilike '%bar%';
Run Code Online (Sandbox Code Playgroud)

您现在可以创建一个索引,如:

CREATE INDEX ON foo USING gist (type, name gist_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

像往常一样,查询和索引之间的列顺序必须相同.

  • 注意还有btree_gin:http://www.postgresql.org/docs/9.4/static/btree-gin.html (2认同)