FTS 不支持LIKE
先前接受的答案不正确。具有全文索引的全文搜索根本不适用于LIKE
运算符,它有自己的运算符并且不适用于任意字符串。它基于字典和词干对单词进行操作。它确实支持words 的前缀匹配,但不支持LIKE
运算符:
三元组索引LIKE
安装为GIN 和 GiST trigram 索引pg_trgm
提供运算符类的附加模块,以支持all和patterns,而不仅仅是左锚定的:LIKE
ILIKE
示例索引:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
或者:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
示例查询:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
八卦?较短的字符串呢?
索引值中少于 3 个字母的单词仍然有效。手册:
在确定字符串中包含的三元组时,每个单词都被认为具有两个前缀和一个空格后缀。
以及少于 3 个字母的搜索模式?手册:
对于LIKE
正则表达式搜索,请记住,没有可提取三元组的模式将退化为全索引扫描。
意思是,索引/位图索引扫描仍然有效(准备好的语句的查询计划不会中断),它只是不会给你带来更好的性能。通常没有大的损失,因为 1 或 2 字母字符串几乎没有选择性(超过基础表匹配的百分之几),并且索引支持一开始不会提高性能,因为全表扫描更快。
text_pattern_ops
或COLLATE "C"
用于前缀匹配
更新
由于 Postgres 9.1,COLLATE "C"
更好。看:
原始答案
对于仅左锚定模式(没有前导通配符),您可以通过合适的运算符类为 btree 索引获得最佳值:text_pattern_ops
或varchar_pattern_ops
. 这两个标准 Postgres 的内置功能,不需要额外的模块。性能相似,但索引小得多。
示例索引:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
示例查询:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
或者,如果您应该使用“C”语言环境(实际上没有语言环境)运行数据库,那么无论如何都会根据字节顺序对所有内容进行排序,并且使用默认运算符类的普通 btree 索引可以完成这项工作。
进一步阅读