Сопоставить части запроса с индексом триграммы - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть таблица events, где каждое событие имеет title и description.Поиски должны искать в обоих столбцах:

title : Дик (ens) и Джейн
description : еженедельно собираться для обсуждения классических книг!

Учитывая вышесказанное, я бы хотел, чтобы запрос совпадал с book club.

Мой индекс:

CREATE INDEX evsearch_idx on events using gist((title || ' ' || description) gist_trgm_ops)

Мой запрос:

SELECT * FROM events WHERE title || ' ' || description ILIKE '%book club%'

Мне кажется, проблема в том, что я в корне неправильно понимаю, как работает индекс, и поэтому он пытается сопоставить всю строку book club с различными трехбуквенными комбинациями, но я не уверен, как это исправить.

1 Ответ

0 голосов
/ 08 сентября 2018

ILIKE всегда будет пытаться сопоставить всю строку.Например, чтобы соответствовать ILIKE '%book club%', строке необходимо , чтобы включить всю строку book club.

Если вы хотите использовать потенциал совпадения подобия pg_trm, вам необходимоиспользуйте соответствующие операторы, для которых он был разработан.Взято из документа :

  1. % возвращает значение true, если его аргументы имеют сходство, которое больше текущего порога сходства, установленного параметром pg_trgm.simility_threshold.
  2. <% возвращает значение true, если сходство между триграммой, заданной в первом аргументе, и непрерывным экстентом упорядоченной триграммы, заданной во втором аргументе, превышает текущий порог сходства слов, установленный параметром pg_trgm.word_simility_threshold.

Дополнительное примечание # 1 : сделайте его без учета регистра, добавив lower(...) в определение индекса и в свои запросы.

Дополнительное примечание # 2 :title || ' ' || description вернет NULL, если title или description НЕДЕЙСТВИТЕЛЕН.Если вы хотите защититься от того, что одно из 2 значений равно NULL, создайте индекс для COALESCE(title, '') || ' ' || COALESCE(description, '')

Примечание: 3 : pg_trgm может делать только так много.Для действительно сложных запросов вам может понадобиться полнотекстовый поиск

...