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

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

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

166
0
6
Общее количество ответов: 6

Ответ #1

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

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

В 9X_sql большинстве реализаций полнотекстового поиска 9X_full-text-indexing используется «инвертированный индекс». Это 9X_sqlselect индекс, в котором ключи - это отдельные 9X_fulltext-searching термины, а связанные значения - это наборы 9X_sql-like записей, которые содержат термин. Полнотекстовый 9X_sql-select поиск оптимизирован для вычисления пересечения, объединения 9X_full-text-search и т. Д. Этих наборов записей и обычно предоставляет 9X_sql-query алгоритм ранжирования для количественной 9X_sql оценки того, насколько сильно данная запись 9X_fts соответствует ключевым словам поиска.

Оператор 9X_sql-syntax SQL LIKE может быть крайне неэффективным. Если 9X_sqlselect вы примените его к неиндексированному столбцу, для 9X_sql-statement поиска совпадений будет использовано полное 9X_sql-statement сканирование (как и любой запрос к неиндексированному 9X_sql-like полю). Если столбец проиндексирован, сопоставление 9X_sql-query может быть выполнено по индексным ключам, но 9X_fts с гораздо меньшей эффективностью, чем большинство 9X_full-text-indexing поисков по индексу. В худшем случае шаблон 9X_sql-like LIKE будет иметь ведущие подстановочные 9X_fulltext знаки, требующие проверки каждого ключа 9X_fulltext-searching индекса. Напротив, многие системы поиска 9X_sql информации могут включать поддержку ведущих 9X_sqlselect подстановочных знаков путем предварительной 9X_fulltext компиляции деревьев суффиксов в выбранных 9X_sql-like полях.

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

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

197
1

  • рейтинг лучше объясняется в [ответе] ...

Ответ #2

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

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

43
0

Ответ #3

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

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

Также из this SO answer:

У полнотекстового 9X_full-text-search поиска есть несколько преимуществ.

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

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

WHERE Foo LIKE '%Bar';

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

Основание:

Полнотекстовый поиск может 9X_sql определять слова. Если вы выполните поиск 9X_sql-statement по запросу «бег», вы можете получить результаты 9X_sql-select по «бегу» или «бегу». Большинство полнотекстовых 9X_full-text-search машин имеют базовые словари на разных языках.

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

Полнотекстовый 9X_sql-statement индекс может включать несколько столбцов. Например, вы 9X_sql-syntax можете выполнить поиск по запросу «персиковый 9X_fulltext пирог», и индекс может включать заголовок, ключевые 9X_fts слова и текст. Результаты, соответствующие 9X_sql названию, могут иметь больший вес, как более 9X_full-text-search релевантные, и их можно отсортировать, чтобы 9X_sql-query они отображались вверху.

Недостатки:

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

Полнотекстовые индексы также могут 9X_full-text-indexing обновляться медленнее. Если данные сильно 9X_full-text-search меняются, это может означать некоторую задержку 9X_sql-query обновления индексов по сравнению со стандартными 9X_sql-statement индексами.

30
0

Ответ #4

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

Like использует только подстановочные знаки, и 9X_sql это не так уж и важно.

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

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

18
1

  • Я настоятельно рекомендую всем проверить [SOUNDEX] (https://docs.microsoft.com/en-us/sql/t-sql/functions/sou ...

Ответ #5

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

Настоящая разница заключается в методах 9X_fts сканирования. Для полнотекстового поиска 9X_sql-query слова (термины) используются в качестве 9X_sql-select хэш-ключей, каждый из которых связан с массивом 9X_fulltext-searching документов, в которых появляются эти ключи 9X_sql-statement (термины). Это выглядит так:

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

Теперь матрица 9X_sql-statement термин-документ (член какого термина в каком 9X_fts документе) может быть представлена ​​как:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Когда 9X_sql-select приходит запрос «Получить мне все документы, содержащие 9X_sql-syntax слово / термин t1», возвращается набор документов 9X_fulltext-searching {d1, d5, d9,.. dn}.

Вы можете взломать ненормализованную схему 9X_sql-syntax таблицы для хранения документов - каждая 9X_full-text-search строка в таблице MySQL будет считаться «документом», а 9X_fulltext столбец ТЕКСТ может содержать абзац и т. д. Инвертированный 9X_sql-statement индекс будет содержать термины как хеш-ключи 9X_full-text-search и идентификаторы строк как идентификаторы 9X_full-text-search документов.

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

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

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

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

Предупреждение: если вы добавите ORDER 9X_sql-statement BY к этому запросу, время выполнения будет 9X_sql-syntax зависеть от нескольких параметров, одним 9X_sql-like из которых является количество совпадающих 9X_full-text-indexing строк / документов. Так что будьте осторожны.

LIKE 9X_sql-like ничего этого не понимает. Он вынужден линейно 9X_sql сканировать предложение / строку и находить 9X_sql-syntax все подходящие термины. Добавление подстановочного 9X_sql-like знака усугубляет беспорядок. Как вы можете 9X_full-text-search себе представить, он отлично работает для 9X_full-text-search строк небольшой длины, но не работает с 9X_sql-select более длинными предложениями. И определенно 9X_sql несопоставимо, если у вас есть абзац или 9X_sql-like целая страница текста и т. Д.

12
0

Ответ #6

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

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

3
0