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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Indexing:

Что-то вроде:

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

Морфологический:

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

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

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

Недостатки:

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

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

Ответ 5

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

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

Теперь матрица term-document (член терминов из документа) может быть представлена ​​как:

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}.

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

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

  • Число слов/терминов в столбце TEXT
  • Количество строк/документов, соответствующих критериям
  • Длина слов/терминов

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

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

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

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

Ответ 6

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