Полнотекстовый поиск — это метод работы с базами данных, который позволяет получить записи, даже если они не совсем соответствуют критериям поиска. С его помощью вы можете осуществлять поиск на естественном языке, который кажется более привычным.
При поиске «database engine» будут возвращены результаты, содержащие фразы «database», «engine» или «database engine». Это устраняет возможные двусмысленности в критериях поиска, поэтому строки типа «У меня есть база данных и двигатель» все равно будут показаны.
Простой поиск в MySQL можно выполнить с помощью функции:
|
Это неэффективно и ограничено по функциональности. MySQL обычно приходится выполнять полное сканирование таблицы, чтобы найти записи, соответствующие вашему запросу.
Полнотекстовые запросы используют специально созданный индекс для повышения производительности. Это также позволяет MySQL отслеживать слова в вашем наборе данных, облегчая поиск на естественном языке.
Настройка полнотекстового поиска
Вы можете использовать полнотекстовый поиск только в тех столбцах, которые имеют полнотекстовый индекс. Для этого используйте предложение
|
в
|
чтобы настроить его при создании схемы базы данных. Вы также можете использовать его с
|
чтобы добавить поисковый индекс к существующим столбцам.
|
После создания индекса вы можете приступать к выполнению запросов к базе данных.
Использование полнотекстового поиска
Полнотекстовый поиск начинается с
|
Вы используете
|
вместо
|
Вам нужно указать индексированные столбцы для поиска, а также запрос для поиска.
|
Полнотекстовый поиск будет выполнен по статьям с использованием запроса:
|
Указывая:
|
MySQL получает указание интерпретировать запрос буквально, никак его не обрабатывая. Режим поиска происходит по умолчанию, если запрос не указан.
Упорядочивание по релевантности результатов
Одно из преимуществ полнотекстового поиска заключается в том, что он позволяет упорядочить найденные записи по релевантности. Это невозможно при использовании обычного
|
Вы можете использовать:
|
как часть SQL-запроса
|
Возвращаемый виртуальный столбец будет содержать оценку релевантности, от 0 до 1, показывающую, насколько запись соответствует поисковому запросу.
|
Этот запрос будет возвращать в первую очередь наиболее релевантные результаты. Это поможет вашему приложению соответствовать ожиданиям пользователей относительно того, как должны работать системы поиска на естественном языке.
MySQL рассчитывает оценку релевантности поиска, оценивая несколько различных факторов. К ним относятся количество записей, соответствующих запросу, а также количество раз, когда запрос встречается в каждой записи. Результат, содержащий несколько точных совпадений с запросом, будет ранжироваться выше, чем тот, который содержит только часть запроса.
При использовании
|
в
|
не нужно повторять его в операторе
|
Можно вручную отфильтровать результаты, чтобы включить только записи с ненулевым показателем релевантности.
|
Режим расширения запросов
Естественный язык — не единственный поддерживаемый режим полнотекстового поиска. Режим расширения запросов - это альтернатива, которая помогает расширить диапазон результатов поиска. Он автоматически взвешивает поисковый запрос по наиболее релевантным терминам.
Расширенный поиск начинается с поиска записей, содержащих совпадения с запросом. Затем эти записи проверяются для выявления наиболее релевантных слов. Затем база данных запускает еще один поиск, на этот раз основываясь на релевантных словах, а не на исходном запросе. В результате обычно возвращается больше записей при сохранении приемлемой степени релевантности.
Вот как включить режим расширения запросов:
|
Булевский режим
Последний режим полнотекстового поиска - это булевский режим. Он позволяет включать в запрос булевы модификаторы. Вы можете использовать этот режим, когда вам нужен расширенный контроль над логикой поиска.
Вы можете потребовать, чтобы слово присутствовало в каждом результате, добавив к нему префикс
|
Используйте
|
чтобы исключить результаты, содержащие это слово. Другие операторы можно использовать для сопоставления частей слов, создания подвыражений и снижения оценки релевантности слов. Последнее может быть полезно при маскировке «шумовых» терминов. Если вы не укажете оператор, подразумевается, что слово будет упоминаться в запросе с помощью
|
|
Этот запрос выведет на поверхность статьи, в которых есть хотя бы одно слово, начинающееся с
|
в
|
не упоминается. Каждый результат может включать или не включать слово
|
Булевский режим позволяет создавать мощные поисковые запросы, используя собственную логику. Одна оговорка - он не поддерживает оценку релевантности поиска. В этом и заключается компромисс между предоставлением пользователям возможности осуществлять логический поиск. Ранжирование результатов может не соответствовать человеческим ожиданиям.
Настройка полнотекстового поиска
MySQL идет с несколькими опциями конфигурации полнотекстового поиска, которые позволяют точно настроить его работу. Вот несколько наиболее важных из них.
|
Устанавливает минимальную длину слова для индексируемых терминов. Слова с меньшим количеством символов, чем это значение, не будут добавлены в индекс, и вы не сможете их искать. Значение по умолчанию
|
что исключает чрезвычайно распространенные слова, такие как
|
или
|
и
|
Эта настройка применяется к таблицам InnoDB; для MyISAM используйте:
|
|
аналогично к
|
но здесь задается максимальная длина индексируемых слов. Более длинные слова не будут доступны для поиска. Для таблиц MyISAM используйте:
|
|
Этот параметр, включенный по умолчанию, позволяет вам контролировать, должен ли MySQL отфильтровывать «стоп-слова». Стоп-слова — это очень часто используемые слова, которые могут неоправданно влиять на результаты поиска. По умолчанию список стоп-слов содержит 36 часто встречающихся фраз.
|
Вы можете задать это значение как имя таблицы базы данных, из которой MySQL должен брать список стоп-слов. Эта таблица должна содержать один
|
столбец названный
|
Добавьте свои стоп-слова, чтобы исключить их как записи в этой таблице.
Эти параметры обычно задаются в файле конфигурации сервера MySQL. Его расположение зависит от платформы; чаще всего его можно найти по адресу
|
После изменения настроек необходимо перезапустить службу MySQL.
Как только сервер будет восстановлен, перестройте полнотекстовые индексы для вашей таблицы. Это необходимо сделать, чтобы данные были переиндексированы с использованием текущей конфигурации. В противном случае будут по-прежнему использоваться ранее проиндексированные данные.
Чтобы переиндексировать таблицу InnoDB, выполните команду:
|
Для таблиц MyISAM используйте команду:
|
После этого поисковые индексы будут перестроены, чтобы изменения в конфигурации вступили в силу.
Подведем итоги
Полнотекстовый поиск в MySQL включается путем добавления параметра
|
индекса к полям для поиска. Затем вы используете:
|
с одним из трех режимов поиска, чтобы получить результаты. Запросы на естественном языке возвращают оценку релевантности поиска, которую можно использовать для ранжирования результатов.
Полнотекстовый поиск предлагает более мощные возможности поиска, чем оператор:
|
Кроме того, он гораздо производительнее, особенно в больших массивах данных, поскольку весь текст индексируется заранее.