Что такое полнотекстовый поиск против 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)