Я просто прочитал сообщение, в котором упоминается "полнотекстовый поиск" в SQL.
Мне просто интересно, какая разница между FTS и LIKE. Я прочитал несколько статей, но не смог найти ничего, что объясняло бы это хорошо.
Я просто прочитал сообщение, в котором упоминается "полнотекстовый поиск" в SQL.
Мне просто интересно, какая разница между FTS и LIKE. Я прочитал несколько статей, но не смог найти ничего, что объясняло бы это хорошо.
В общем, существует компромисс между "точностью" и "отзывом". Высокая точность означает, что представлено меньше нерелевантных результатов (нет ложных срабатываний), в то время как высокий отзыв означает, что меньше релевантных результатов отсутствует (нет ложных негативов). Использование оператора LIKE дает 100% точность без уступок для отзыва. Полнотекстовый поиск дает вам большую гибкость для настройки точности для лучшего отзыва.
В большинстве полнотекстовых поисковых реализаций используется "инвертированный индекс". Это индекс, где ключи являются отдельными терминами, а связанные значения - это группы записей, которые содержат этот термин. Полнотекстовый поиск оптимизирован для вычисления пересечений, объединений и т.д. Этих наборов записей и обычно предоставляет алгоритм ранжирования для количественной оценки того, насколько сильно данная запись соответствует ключевым словам поиска.
Оператор SQL LIKE может быть крайне неэффективным. Если вы примените его к столбцу без индексации, для поиска совпадений будет использоваться полное сканирование (точно так же как любой запрос в неиндексированном поле). Если индекс индексируется, сопоставление может выполняться с помощью индексных ключей, но с гораздо меньшей эффективностью, чем большинство запросов индекса. В худшем случае шаблон LIKE будет иметь основные шаблоны, которые требуют, чтобы каждый индексный ключ был проверен. Напротив, многие информационно-поисковые системы могут поддерживать поддержку ведущих подстановочных знаков путем предварительной компиляции суффиксов в выбранных полях.
Другие функции, характерные для полнотекстового поиска,
FTS включает в себя индексирование отдельных слов в текстовом поле, чтобы быстро выполнить поиск по многим записям. Использование LIKE по-прежнему требует выполнения строкового поиска (линейного или подобного) в поле.
Как и использование подстановочных знаков, и не все настолько мощные.
Полный текст позволяет гораздо более сложный поиск, включая And, Or, Not, даже похожие результаты звучания (SOUNDEX) и многие другие элементы.
Я бы посмотрел на SQL CONTAINS() FREETEXT() и связанные с ним элементы поиска Full Text, чтобы лучше понять, что доступно.
MySQL создает индекс из слов разрешенного полнотекстового столбца поиска и выполняет поиск по этому индексу. MySQL использует сложный алгоритм для определения строк, сопоставленных с поисковым запросом.
Есть несколько преимуществ для полнотекстового поиска.
Indexing:
Что-то вроде:
ГДЕ Foo LIKE '% Bar'; Невозможно воспользоваться индексом. Он должен смотреть на каждую строку и видеть, совпадает ли она. Однако полнотекстовый индекс может. Фактически, полнотекстовые индексы могут предлагать гораздо большую гибкость в отношении порядка совпадающих слов, как близко эти слова вместе и т.д.
Морфологический:
Полнотекстовый поиск может остановить слова. Если вы ищете запуск, вы можете получить результаты для "ran" или "running". Большинство полнотекстовых движков имеют словарные словари на разных языках.
Взвешенные результаты:
Полнотекстовый индекс может охватывать несколько столбцов. Например, вы можете искать "персиковый пирог", и индекс может включать заголовок, ключевые слова и тело. Результаты, соответствующие названию, могут быть взвешены выше, как более релевантные, и их можно сортировать, чтобы показать их в верхней части.
Недостатки:
Полнотекстовый индекс потенциально может быть огромным, во много раз превышающим стандартный индекс B-TREE. По этой причине многие хостинг-провайдеры, предлагающие экземпляры базы данных, отключают эту функцию или, по крайней мере, взимают дополнительную плату за нее. Например, последнее, что я проверил, Windows Azure не поддерживает полнотекстовые запросы.
Полнотекстовые индексы также могут быть медленнее обновляться. Если данные меняют лот, могут быть некоторые индексы обновления запаса по сравнению со стандартными индексов.
Реальное различие заключается в методах сканирования. Для полнотекстового поиска слова (термины) используются как хеш-ключи, каждый из которых связан с массивом документов, в которые входят ключи (термины). Пример:
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). Запрос не зависит от
Например, этот SQL может быть запущен, чтобы извлечь все строки, соответствующие данному слову XYZ:
SELECT *
FROM my_table
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ;
Предостережение. Если вы добавите ORDER BY в этот запрос, ваши среды выполнения будут зависеть от нескольких параметров, одним из которых является количество совпадающих строк/документов. Так что будьте осторожны.
LIKE, однако, ничего не знает об этом. Он вынужден линейно сканировать предложение/строку и находить все соответствующие термины. Добавление дикой карты добавляет к беспорядку. Он отлично работает для небольших строк длины, как вы можете себе представить, но будет терпеть неудачу для более длинных предложений. И определенно не сопоставимо при наличии абзаца или целой страницы текста и т.д.
FTS более эффективен, эффективен (особенно для Word Breakers и функциональных возможностей) ... но проверьте свои требования, потому что иногда БД не поддерживают все языки, например, MSSQL не поддерживает греческий (проверьте на этой странице http://msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx)