Ula*_*ach 4 sql postgresql indexing trigram
postgres trigram 文档指出:
pg_trgm 模块提供 GiST 和 GIN 索引运算符类,允许您在文本列上创建索引,以实现非常快速的相似性搜索。这些索引类型支持上述相似性运算符,并且还支持 LIKE、ILIKE、~ 和 ~* 查询的基于三元组的索引搜索。
并显示以下示例:
SELECT t, word_similarity('word', t) AS sml
FROM test_trgm
WHERE 'word' <% t
ORDER BY sml DESC, t;
Run Code Online (Sandbox Code Playgroud)
惊人的!
但是,当运行以下查询时:
SELECT *
FROM place
WHERE word_similarity(place.name, '__SOME_STRING__') > 0.5
Run Code Online (Sandbox Code Playgroud)
创建的索引未被使用。
然而,当使用ILIKEor%>运算符时,看起来确实正在使用索引。为什么函数上不使用索引word_similarity?
根据这个postgres 论坛的回复
PostgreSQL 不使用 WHERE 子句中的函数进行索引扫描。所以你总是需要使用运算符。您可以尝试 <% 运算符和 pg_trgm.word_similarity_threshold 变量:
=# 将 pg_trgm.word_similarity_threshold 设置为 0.1;
=# SELECT 名称,流行度 FROM temp.items3_v ,(values ('somephrase'::text)) consts(input) WHERE input <% name ORDER BY 2, input <<-> name;
因此,可以将查询更新为使用索引,如下所示:
SET pg_trgm.word_similarity_threshold TO 0.1;
SELECT *
FROM place
WHERE place.name <<-> '__SOME_STRING__';
Run Code Online (Sandbox Code Playgroud)
警告:操作员仅使用仅具有一种版本的换向器对的索引。即,它只使用了 case 中的索引<<->,而不使用了 case <->>。这个堆栈溢出问答帖子看起来给出了一个合理的解释:
这些是不同的操作,索引仅支持其中之一。