Каков наилучший способ поиска точного соответствия с помощью полнотекстового поиска Postgres?

У меня есть база данных Postgres с 1,5 миллионами записей. В моем приложении Ruby on Rails мне нужно найти statement_text поле (которое может содержать от 1 до сотен слов).

Моя проблема: я знаю, что могу использовать pgSearch драгоценный камень для создания таких областей, как search_all_words или же search_any_words, но я не уверен, каков наиболее эффективный способ обеспечить, чтобы в наборе результатов возвращались только записи с точным соответствием.

То есть, если я ищу "Папа Фрэнсис", я хочу, чтобы он нашел только те два слова, когда они последовательны и в одном и том же порядке (в отличие от, скажем, "Папа по имени Фрэнсис").

Пока что я только что объединил индекс GIN с ILIKE для точного поиска совпадений. Но, учитывая, что индекс GIN по сути работает, сохраняя точную позицию слова в каждой записи, разве не должно быть более эффективным (неILIKE) способ обеспечить, чтобы поисковый термин был точным совпадением с полем?

1 ответ

Решение

Вообще говоря, для полнотекстового поиска требуется основание слова на основе используемого словаря языка, поэтому с помощью полнотекстового поиска вы можете ts_rank() функционировать без 'simple' словарь для определения релевантности фразы, которую вы ищете.

WITH t(v) AS ( VALUES
  ('Test sentence with Pope Francis'),
  ('Test Francis sentence with Pope '),
  ('The pope is named Francis')
)
SELECT v,ts_rank(tsv,q) as rank
FROM t,
    to_tsvector('simple',v) as tsv,
    plainto_tsquery('simple','Pope Francis') AS q;

Результат:

                v                 |   rank    
----------------------------------+-----------
 Test sentence with Pope Francis  | 0.0991032
 Test Francis sentence with Pope  | 0.0973585
 The pope is named Francis        | 0.0973585
(3 rows)

Без полнотекстового поиска вы можете реализовать просто быстрее ILIKE сопоставление с образцом pg_trgm расширение. Пример здесь.

Другие вопросы по тегам