【问题标题】:Why is postgres trigram word_similarity function not using a gin index?为什么 postgres trigram word_similarity 函数不使用 gin 索引?
【发布时间】:2020-05-27 08:48:57
【问题描述】:

postgres trigram documentation 声明:

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;

太棒了!

但是,当运行以下查询时:

SELECT * 
FROM place 
WHERE word_similarity(place.name, '__SOME_STRING__') > 0.5

创建的索引未被使用。

但是,当使用 ILIKE%&gt; 运算符时,似乎正在使用索引。为什么word_similarity 函数上没有使用索引?

【问题讨论】:

    标签: sql postgresql indexing trigram


    【解决方案1】:

    据此postgres forum response

    PostgreSQL 不对 WHERE 子句中的函数使用索引扫描。所以 您总是需要使用运算符。您可以尝试

    =# SET pg_trgm.word_similarity_threshold TO 0.1;

    =# SELECT 名称,受欢迎程度 来自 temp.items3_v ,(values ('some phrase'::text)) consts(input) WHERE 输入 姓名;

    因此,可以按如下方式更新查询以使用索引:

    SET pg_trgm.word_similarity_threshold TO 0.1;
    SELECT * 
    FROM place 
    WHERE place.name <<-> '__SOME_STRING__';
    

    警告:运算符仅使用只有一个版本的换向器对的索引。即,它仅在&lt;&lt;-&gt; 的情况下使用了索引,而不在&lt;-&gt;&gt; 的情况下使用了索引。 This stack overflow q/a post 似乎给出了一个合理的解释:

    这些是不同的操作,索引只支持其中一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2014-02-06
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多