Полнотекстовый поиск в сочетании с fuzzysearch в PostgreSQL
Я хочу реализовать полнотекстовый поиск в postgresql в сочетании с нечетким поиском. Для моего testarea я следил за этой статьей: https://blog.носторонний доступ_io/2015/05/full-text-search-in-milliseconds-with-postgresql/ и все работает нормально. Но иногда у меня есть случаи поиска с пробелами в строке поиска и без них, например:
В моем столбце title есть запись вродеtest123. Моя строка поиска выглядит как "тест 123" с пробелом в нем. Как я могу получить хит в этом тестовом примере?
Мой поисковый sql-запрос выглядит так:
SELECT *
FROM test, plainto_tsquery('test:*&123:*') as q
WHERE (tsv @@ q)
result: 0 rows
Поэтому я попытался выяснить, могу ли я использовать pg_trgm в сочетании с ts_vector, но не могу найти решение. У тебя есть идея?
1 ответ
В документации о разборе говорится:
... plainto_tsquery не распознает операторы tsquery, метки весов или метки совпадения префиксов в своем входе...
Это потому что plainto_tsquery
а также phraseto_tsquery
это удобные функции, которые облегчают поиск по полной строке, но не поддерживают все функции. Вы можете вместо этого использовать to_tsquery
напрямую, так как это самый мощный метод, который принимает полный синтаксис поиска:
SELECT *
FROM test, to_tsquery('testing:* & 123:*') as q
WHERE (tsv @@ q)
Обратите внимание, что это также означает, что вы должны нормализовать текст поиска самостоятельно, чтобы он разбивался на соответствующие основы вместо использования полных слов, но это довольно легко с некоторыми строковыми функциями в сочетании с to_tsvector
:
SELECT STRING_AGG(lexeme || ':*', ' & ')
FROM UNNEST(to_tsvector('testing 123'))
Этот пример возвращает строку как 123:* & test:*
который вы затем можете использовать непосредственно с to_tsquery
чтобы получить нечеткое соответствие с нормализацией нетронутыми.