Полнотекстовый поиск PostgreSQL и путаница Trigram

Я немного смущен всей концепцией PostgreSQL, полнотекстового поиска и Trigram. В моих текстовых поисковых запросах я использую tsvectors, например:

SELECT * FROM articles
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat');

Проблема заключается в том, что этот метод не учитывает орфографию. Затем я начал читать о Trigram и pg_trgm:

Просматривая другие примеры, кажется, что используется триграмм или используются векторы, но оба они оба. Поэтому мои вопросы: они когда-нибудь используются вместе? Если да, то как? Включает ли триграмм полный текст? Являются ли триграммы более точными? И как работают триграммы по производительности?

Ответы

Ответ 1

Они служат в самых разных целях.

  • Поиск в полнотекстовом режиме используется для возврата документов, соответствующих поисковому запросу слов, помеченных словами.
  • Триграммы дают вам метод сравнения двух строк и определения того, как они выглядят.

Рассмотрим следующие примеры:

SELECT 'cat' % 'cats'; --true

Приведенное выше возвращает true, поскольку 'cat' очень похоже на 'cats' (как это определено пределом pg_trgm).

SELECT 'there is a cat with a dog' % 'cats'; --false

Приведенное выше возвращает false, потому что % ищет аналогично между двумя целыми строками, не ищет слово cats внутри строки.

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true

Это возвращает true becausase tsvector преобразовал строку в список словарных слов и проигнорировал кучу общих слов (стоп слова - как "есть" и "а" )... затем искал версию cats.

Похоже, вы хотите использовать триграммы для автокоррекции вашего ts_query, но это не реально (ни в коем случае неэффективным способом). Они действительно не знают, что слово misspelt, просто похоже на другое слово. Они могут использоваться для поиска таблицы слов, чтобы попытаться найти похожие слова, позволяя вам реализовать функцию типа "вы имели в виду...", но это слово требует поддержки отдельной таблицы, содержащей все слова, используемые в вашем search.

Если у вас есть обычные слова/фразы с ошибками, которые вы хотите, чтобы текстовый индекс соответствовал вам, возможно, вам стоит взглянуть на Синонимы-дикториалы