img

Как использовать полнотекстовый поиск в MySQL

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

При поиске «database engine» будут возвращены результаты, содержащие фразы «database», «engine» или «database engine». Это устраняет возможные двусмысленности в критериях поиска, поэтому строки типа «У меня есть база данных и двигатель» все равно будут показаны.

Простой поиск в MySQL можно выполнить с помощью функции:

LIKE

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

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

Настройка полнотекстового поиска

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

FULLTEXT

в

CREATE TABLE

чтобы настроить его при создании схемы базы данных. Вы также можете использовать его с

ALTER TABLE

чтобы добавить поисковый индекс к существующим столбцам.

CREATE TABLE articles(content TEXT, FULLTEXT (content));









ALTER TABLE articles ADD FULLTEXT (content);

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

Использование полнотекстового поиска

Полнотекстовый поиск начинается с

WHERE

Вы используете

MATCH AGAINST

вместо

LIKE

Вам нужно указать индексированные столбцы для поиска, а также запрос для поиска.

SELECT * FROM articles WHERE MATCH (content) AGAINST ('database engine' IN NATURAL LANGUAGE MODE);

Полнотекстовый поиск будет выполнен по статьям с использованием запроса:

database engine

Указывая:

IN NATURAL LANGUAGE MODE

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

Упорядочивание по релевантности результатов

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

LIKE

Вы можете использовать:

MATCH ... AGAINST

как часть SQL-запроса

SELECT

Возвращаемый виртуальный столбец будет содержать оценку релевантности, от 0 до 1, показывающую, насколько запись соответствует поисковому запросу.

SELECT content, MATCH (content) AGAINST ('database engine') AS relevance FROM articles ORDER BY relevance DESC

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

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

При использовании

MATCH ... AGAINST

в

SELECT

не нужно повторять его в операторе

WHERE

Можно вручную отфильтровать результаты, чтобы включить только записи с ненулевым показателем релевантности.

SELECT content, MATCH (content) AGAINST ('database engine') AS relevance FROM articles WHERE relevance > 0 ORDER BY relevance DESC

Режим расширения запросов

Естественный язык — не единственный поддерживаемый режим полнотекстового поиска. Режим расширения запросов - это альтернатива, которая помогает расширить диапазон результатов поиска. Он автоматически взвешивает поисковый запрос по наиболее релевантным терминам.

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

Вот как включить режим расширения запросов:

SELECT * FROM articles WHERE MATCH (content) AGAINST ('database engine' WITH QUERY EXPANSION)

Булевский режим

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

Вы можете потребовать, чтобы слово присутствовало в каждом результате, добавив к нему префикс

+

Используйте

-

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

OR
SELECT * FROM articles WHERE MATCH (content) AGAINST ('+data* engine -sqlite' IN BOOLEAN MODE)

Этот запрос выведет на поверхность статьи, в которых есть хотя бы одно слово, начинающееся с

data

в

sqlite

не упоминается. Каждый результат может включать или не включать слово

engine

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

Настройка полнотекстового поиска

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

innodb_ft_min_token_size

Устанавливает минимальную длину слова для индексируемых терминов. Слова с меньшим количеством символов, чем это значение, не будут добавлены в индекс, и вы не сможете их искать. Значение по умолчанию

3

что исключает чрезвычайно распространенные слова, такие как

a

или

an

и

I

Эта настройка применяется к таблицам InnoDB; для MyISAM используйте:

ft_min_word_len
innodb_ft_max_token_size

аналогично к

innodb_ft_min_token_size

но здесь задается максимальная длина индексируемых слов. Более длинные слова не будут доступны для поиска. Для таблиц MyISAM используйте:

ft_max_word_len
innodb_ft_enable_stopword

Этот параметр, включенный по умолчанию, позволяет вам контролировать, должен ли MySQL отфильтровывать «стоп-слова». Стоп-слова — это очень часто используемые слова, которые могут неоправданно влиять на результаты поиска. По умолчанию список стоп-слов содержит 36 часто встречающихся фраз.

innodb_ft_user_stopword_table

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

VARCHAR

столбец названный 

value

Добавьте свои стоп-слова, чтобы исключить их как записи в этой таблице.

Эти параметры обычно задаются в файле конфигурации сервера MySQL. Его расположение зависит от платформы; чаще всего его можно найти по адресу

/etc/mysql/my.cnf

После изменения настроек необходимо перезапустить службу MySQL.

Как только сервер будет восстановлен, перестройте полнотекстовые индексы для вашей таблицы. Это необходимо сделать, чтобы данные были переиндексированы с использованием текущей конфигурации. В противном случае будут по-прежнему использоваться ранее проиндексированные данные.

Чтобы переиндексировать таблицу InnoDB, выполните команду:

OPTIMIZE TABLE my_table

Для таблиц MyISAM используйте команду:

REPAIR TABLE my_table QUICK

После этого поисковые индексы будут перестроены, чтобы изменения в конфигурации вступили в силу.

Подведем итоги

Полнотекстовый поиск в MySQL включается путем добавления параметра

FULLTEXT

индекса к полям для поиска. Затем вы используете:

MATCH ... AGAINST

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

Полнотекстовый поиск предлагает более мощные возможности поиска, чем оператор:

LIKE

Кроме того, он гораздо производительнее, особенно в больших массивах данных, поскольку весь текст индексируется заранее.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Программирование
Скидка 25%
Python Advanced. Продвинутый курс
Освойте асинхронное и метапрограммирование, изучите аннотацию типов и напишите собственное приложение на FastAPI. Улучшите свои навыки Python, чтобы совершить быстрый рост вашего грейда до уровня middle.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
В этой статье обсудим один из важнейших аргументов функции, который ТЫ, мой друг, будешь использовать в каждом своем боте.  Ты с
img
Введение    Настало время глубже погрузиться во взаимодействие человека с ботом. Сегодня изучим декоратор message_handler(). Узн
img
Погружение в aiogram (#5 Отправка стикеров)   Введение   Продолжаем изучать функционал библиотеки aiogram для работы с Telegram
img
Гипервизор - это программное обеспечение для виртуализации, используемое для создания и запуска виртуальных машин (ВМ). Гипервиз
img
Виртуализация серверов позволяет запускать несколько виртуальных машин на одном физическом сервере. Запуск виртуальных машин (ВМ
img
Сегодня мы рассмотрим, как настроить и использовать PHP в проекте. Но прежде чем начать, нужно понять, что такое PHP. Что такое
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59