Что такое полнотекстовый поиск против LIKE - PullRequest
117 голосов
/ 22 октября 2008

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

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

Ответы [ 6 ]

144 голосов
/ 22 октября 2008

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

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

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

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

  • лексический анализ или токенизация - взлом блок неструктурированного текста в отдельные слова, фразы и специальные жетоны
  • морфологический анализ, или остановка данного слова в один индексный термин; например, лечение "мышей" и «мышь» или «электрификация» и «электрический» как то же слово
  • рейтинг & mdash; измерение Сходство совпадающей записи с строка запроса
37 голосов
/ 22 октября 2008

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

17 голосов
/ 03 марта 2016

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

Кроме того, от этого ТА ответа :

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

Индексация:

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

WHERE Foo LIKE '%Bar';

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

Сдерживание:

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

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

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

Недостатки:

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

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

15 голосов
/ 22 октября 2008

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

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

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

10 голосов
/ 01 апреля 2015

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

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

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

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

  1. Количество слов / терминов в столбце ТЕКСТ
  2. Количество строк / документов, соответствующих критериям
  3. Длина слова / терминов

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

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

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

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

3 голосов
/ 09 февраля 2012

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

...