2013-04-08 3 views
16

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

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

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

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

ответ

29

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

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

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

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

+0

Я добавил несколько примеров, чтобы подчеркнуть различия между '%' и ' @@ 'из каждого расширения. Если ваша цель - найти документы, содержащие английский (или любой известный язык, на котором у вас есть словарь для), вы после полнотекстового поиска. Если ваша цель состоит в том, чтобы сопоставить целое поле со строкой всего поля с немного leeweigh для опечаток, то pg_trgm - это то, что вы хотите. –

+0

Спасибо за объяснение! Это многое прояснило. Итак, похоже, проблема может быть решена путем расширения моих знаний о словарях. –

+1

+1 Хороший, ясный ответ. –

Смежные вопросы