FTS不支持 LIKE
在以前接受的答案是不正确的。具有全文索引的全文搜索根本不适合LIKE
运算符,它具有自己的运算符,不适用于任意字符串。它运行在的话基于字典和制止。它确实支持单词的前缀匹配,但不支持LIKE
运算符:
的Trigram索引 LIKE
安装附加模块pg_trgm
,该模块为GIN和GiST Trigram索引提供运算符类,以支持all LIKE
和ILIKE
pattern,而不仅仅是左锚定的:
索引示例:
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
用于前缀匹配
对于仅左固定模式(无前导通配符),您可以通过为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索引可以完成此工作。
dba.SE上这些相关答案中的更多详细信息,解释,示例和链接: