Они служат в самых разных целях.
- Полнотекстовый поиск используется для возврата документов, соответствующих поисковому запросу слов.
- Триграммы дают вам метод сравнения двух строк и определения того, как они выглядят.
Рассмотрим следующие примеры:
SELECT 'cat' % 'cats'; --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
becauase поискового вектор преобразовал строку в список слов, стебли и игнорировал кучу общих слов (стоп-слова - как «есть» & «а») ... тогда искал стебли версии от cats
.
Похоже, вы хотите использовать триграммы для автокорректноts_query
, но это действительно невозможно (ни в коем случае не эффективный способ). Они на самом деле не знают слово misspelt, насколько это похоже на другое слово. Они могут использовать для поиска таблицы слов, чтобы попытаться найти похожие слова, что позволяет реализовать функцию типа «вы имеете в виду ...», но это слово требует сохранения отдельной таблицы, содержащей все слова, используемые в вашем search
раздел.
Если у вас есть какие-то обычно орфографическими слова/фразы, которые вы хотите, чтобы текст-индекс, чтобы соответствовать вы можете захотеть взглянуть на Synonym Dictorionaries
Я добавил несколько примеров, чтобы подчеркнуть различия между '%' и ' @@ 'из каждого расширения. Если ваша цель - найти документы, содержащие английский (или любой известный язык, на котором у вас есть словарь для), вы после полнотекстового поиска. Если ваша цель состоит в том, чтобы сопоставить целое поле со строкой всего поля с немного leeweigh для опечаток, то pg_trgm - это то, что вы хотите. –
Спасибо за объяснение! Это многое прояснило. Итак, похоже, проблема может быть решена путем расширения моих знаний о словарях. –
+1 Хороший, ясный ответ. –