Что такое полнотекстовый поиск vs LIKE


Я только что прочитал сообщение, в котором упоминается "полнотекстовый поиск" в SQL.

Мне просто интересно, в чем разница между FTS и LIKE. Я прочитал пару статей, но не смог найти ничего, что объяснило бы это хорошо.

6 103

6 ответов:

В общем, есть компромисс между" точностью "и"отзывом". Высокая точность означает, что представлено меньше нерелевантных результатов (без ложных срабатываний), в то время как высокий отзыв означает, что отсутствует меньше релевантных результатов (без ложных негативов). Использование оператора LIKE дает вам 100% точность без каких-либо уступок для отзыва. Средство полнотекстового поиска дает вам большую гибкость для настройки точности для лучшего отзыва.

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

оператор SQL LIKE может быть крайне неэффективным. Если вы примените его к неиндексированному столбцу, полное сканирование будет использоваться для поиска совпадений (просто как и любой запрос на неиндексированное поле). Если столбец индексируется, сопоставление может быть выполнено с ключами индекса, но с гораздо меньшей эффективностью, чем большинство поисков индекса. В худшем случае подобный шаблон будет иметь ведущие подстановочные знаки, которые требуют проверки каждого ключа индекса. Напротив, многие системы поиска информации могут обеспечить поддержку ведущих подстановочных знаков путем предварительной компиляции суффиксных деревьев в выбранных полях.

другие функции, типичные для полнотекстового поиска являются

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

FTS включает индексирование отдельных слов в текстовом поле, чтобы сделать поиск по многим записям быстрым. Использование LIKE по-прежнему требует выполнения строкового поиска (линейного или подобного) в поле.

Как использует только подстановочные знаки, и не все, что мощный.

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

Я бы начал смотреть на SQL CONTAINS() FREETEXT () и связанные с ним элементы полнотекстового поиска, чтобы помочь лучше понять, что доступно.

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

есть несколько преимуществ для полнотекстового поиска.

индексирование:

что-то типа:

где Foo нравится '%Bar'; Невозможно воспользоваться индексом. Он должен посмотреть на каждую строку и посмотреть, соответствует ли она. Один полнотекстовый индекс, однако, может. На самом деле, полнотекстовые индексы могут предложить гораздо большую гибкость с точки зрения порядка совпадения слов, насколько близки эти слова друг к другу и т. д.

Stemming:

полнотекстовый поиск может основываться на словах. Если вы ищете run, вы можете получить результаты для "ran" или "running". Большинство полнотекстовых движков имеют словари stem на различных языках.

Взвешенные Результаты:

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

недостатки:

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

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

реальная разница заключается в методологии сканирования. Для полнотекстового поиска слова (термины) используются в качестве хэш - ключей, каждый из которых связан с массивом документов, в которых отображаются ключи (термины). Его вроде этого:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

теперь матрица термина-документа (какой член термина какого документа) может быть представлена как:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

когда приходит запрос с просьбой "получить мне все документы, содержащие слово / термин t1" - тогда набор документов {d1, d5, d9,.. dn} is возвращенный.

вы можете взломать де-нормализованную схему таблицы для хранения документов - каждая строка в таблице MySQL будет рассматриваться как" документ", а текстовый столбец может содержать абзац и т. д. Инвертированный индекс будет содержать термины в качестве хэш-ключей и идентификаторы строк в качестве идентификаторов документов.

помните, что этот SQL-запрос будет иметь более или менее O(1) производительность. Запрос будет независим от

  1. количество слов/терминов в тексте колонка
  2. количество строк/документов, соответствующих критериям
  3. длина слов / терминов

например, этот SQL может быть запущен для извлечения всех строк, соответствующих данному слову XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

предостережение: если вы добавляете ORDER BY к этому запросу, ваше время выполнения будет отличаться в зависимости от нескольких параметров, одним из которых является количество совпадающих строк/документов. Так что будьте осторожны.

подобное, однако, ничего из этого не имеет. Это вынужден линейно сканировать предложение / строку и найти все соответствующие термины. Добавление wild card добавляет беспорядок. Он отлично работает для строк малой длины, как вы можете себе представить, но потерпит неудачу для более длинных предложений. И, безусловно, не сопоставимы при наличии абзаца или целой страницы текста и т. д.

FTS является более эффективным, мощным (особенно для Word Breakers и stemming функциональных возможностей) ... но проверьте свои требования, потому что иногда DBs не поддерживают все языки, например MSSQL не поддерживает греческий (проверьте на этой странице http://msdn.microsoft.com/en-us/library/ms176076(v=sql. 110). aspx)