Что такое Полнотекстовый поиск по сравнению с ПОДОБНЫМ

StackOverflow https://stackoverflow.com/questions/224714

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

Кроме того, из это ТАКОЙ ответ:

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

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

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

WHERE Foo LIKE '%Bar';

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

Вытекающий:

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

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

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

Недостатки:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top