Почему postgres триграмма функция word_s Similarity не использует индекс джина? - PullRequest
0 голосов
/ 12 февраля 2020

В документации по триграмме 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?

1 Ответ

1 голос
/ 12 февраля 2020

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

PostgreSQL не использует сканирование индекса с функциями в предложении WHERE. Таким образом, вы всегда должны использовать операторы вместо этого. Вы можете попробовать <% operator и переменную pg_trgm.word_simility_threshold: </p>

= # SET pg_trgm.word_sdentifity_threshold TO 0.1;

= # SELECT name, популярность FROM temp.items3_v, (values ​​('некоторая фраза) ':: 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__';

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

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

...