Почему функция postgres trigram word_similarity не использует индекс джина?

В документации по триграмме postgres говорится:

Модуль 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 или %> кажется, что индекс используется. Почему индекс не используется в функции word_similarity?


person Ulad Kasach    schedule 11.02.2020    source источник


Ответы (1)


Согласно этому ответ форума postgres

PostgreSQL не использует сканирование индекса с функциями в предложении WHERE. Поэтому вам всегда нужно использовать операторы. Вы можете попробовать оператор ‹% и переменную pg_trgm.word_similarity_threshold:

=# УСТАНОВИТЬ pg_trgm.word_similarity_threshold TO 0.1;

=# ВЫБЕРИТЕ имя, популярность ИЗ temp.items3_v ,(значения ('какая-то фраза'::текст)) 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__';

Внимание: оператор использует индекс только с одной версией коммутаторной пары. То есть он использовал индекс только в случае <<->, а не в случае <->>. Это переполнение стека q/a post выглядит так, как будто дает разумное объяснение, почему:

Это разные операции, и только одна из них поддерживается индексом.

person Ulad Kasach    schedule 11.02.2020