Чем именно отличается нечеткий поиск от полнотекстового поиска? - PullRequest
0 голосов
/ 25 февраля 2020

В моем проекте меня попросили внедрить службу текстовых запросов в базу данных, которую мы используем; Postgresql. Я использовал Postgresql Полнотекстовый поиск функции, которые работают довольно хорошо с точки зрения времени. Одна из проблем полнотекстового поиска заключается в том, что у него нет нечетких возможностей поиска. С другой стороны, существует расширение с именем pgtrgm , предоставляющее функции и операторы для определения сходства alphanumeri c text . Также есть несколько примеров текстового поиска с использованием pgtrgm, например:

select actor
    from products
    where actor % 'tomy';

Как вы знаете, пример postgres FTS также здесь;

SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery('friend');

Итак, главный вопрос, в чем разница между этими двумя стратегиями поиска? Какой из них больше подходит для поиска текстов? Можно ли их смешать? Я также должен сказать, что производительность также является важной проблемой. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Они делают совершенно разные вещи. Единственное, что между ними не отличается, это то, что они работают с текстом и могут извлечь выгоду из использования индексов. Из вашего вопроса, кажется, вы уже хорошо понимаете различия. Подходящий тот, который делает то, что вы хотите. Если бы один из них всегда был уместен, мы, вероятно, не создали бы другой.

Вы можете смешивать их, но вам понадобятся разные индексы для каждого, они не могут совместно использовать индекс. Кроме того, вам, вероятно, потребуются и другие таблицы, поскольку полнотекстовый поиск больше подходит для предложений или абзацев, а триграмма для отдельных слов или коротких фраз.

Один из способов смешать их - это иметь одну таблицу полных текстов. и другую таблицу, в которой перечислены только каждое отдельное слово, присутствующее в любом из полных текстов. 2-ю таблицу можно использовать для обнаружения возможных опечаток в запросе, а затем, как только они будут исправлены предложениями из поиска по триграмме, выполнить фиксированный запрос для 1-й таблицы.

1 голос
/ 25 февраля 2020

Разница довольно велика - в нечетком поиске вы ищете похожий результат, в полнотекстовом поиске - точно такой же. Если один из них более уместен, чем другой, это вопрос варианта использования.

Если вам не нужна нечеткость, не используйте ее, это приводит к огромным потерям производительности, потому что оно должно точно соответствовать тексту, но также попробуйте другие комбинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...