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不是严格的全文,但我正在这样标记这个问题)
您可以使用组合不同类型的多列索引.
首先,添加您的案例中所需的两个扩展:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;
Run Code Online (Sandbox Code Playgroud)
pg_trgm允许你使用trigram索引,btree_gist允许你组合gist和b-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)
像往常一样,查询和索引之间的列顺序必须相同.