索引条件lower(f) LIKE '%foo%'

-1 postgresql index postgresql-extensions

如何使用非锚定搜索模式索引以下语句

SELECT somefield
FROM sometable 
WHERE lower(somefield2) like '%foo%';
Run Code Online (Sandbox Code Playgroud)

有些行有超过 2k 字节。

Jas*_*sen 5

撇开长度不谈,btree 索引无助于该查询。您可以创建一个哈希索引,但这也只有在查询需要与整个列完全匹配时才有帮助。不适用于子字符串模式。首先做你想做的,添加pg_trgm扩展:

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

然后创建一个三元组索引:

CREATE INDEX trgm_idx ON sometable
  USING GIN (somefield2 gin_trgm_ops); -- can also be GIST
Run Code Online (Sandbox Code Playgroud)

三字母索引可以帮助SQL的找到匹配LIKEILIKE和正则表达式模式。

有关更多信息,请参阅文档 pg_trgm