Полнотекстовый поиск в сочетании с 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 чтобы получить нечеткое соответствие с нормализацией нетронутыми.

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