Каков наилучший способ поиска точного соответствия с помощью полнотекстового поиска 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
расширение. Пример здесь.