Полнотекстовой поиск в MySQL

Полнотекстовой поиск в MySQL на сегодняшний день поддерживается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса FULLTEXT для столбцов, по которым необходимо осуществлять поиск.

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

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

ALTER TABLE mytable ADD FULLTEXT name (name);

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

Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:

ALTER TABLE mytable ADD FULLTEXT name (name, description);

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

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

ALTER TABLE mytable ADD FULLTEXT (name),
                    ADD FULLTEXT (description),
                    ADD FULLTEXT together (name, description);

Поиск выполняется при помощи встроенной функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функции AGAINST(), которая принимает в качестве аргумента искомую строку:

SELECT * FROM mytable WHERE MATCH(name) AGAINST('программирование');

Здесь из таблицы mytable извлекаются все записи, поле name которых содержит слово “программирование”. Синтаксис допускает использование нескольких конструкций MATCH() - AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND:

SELECT * FROM mytable WHERE MATCH(together) AGAINST('программирование')
                         OR MATCH(together) AGAINST('кодирование');

Здесь из таблицы mytable извлекаются все записи, поля name или description которых содержат либо слово “программирование”, либо слово “кодирование”.

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

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

Ссылки по теме:

Комментариев: 3

  1. Илья:

    Долго искал блог на подобную тематику и наконец нашёл. Удивительно что раньше я не знал о его существовании, ведь с давних пор занимался вещами такого рода. Порадовало, конечно, наличие полезной информации лично для меня и я абсолютно согласен со всеми остальными людьми, оставившие свои комментарии в данном блоге. Удобная навигация, думаю, также многих порадовало. Хотелось бы и себе замутить такой блог, да нет времени, поэтому легче пользоваться этим блогом. Администратор блога – молодец. Так держать! всё супер, с огромным уважением отношусь к людям, создающие блоги на такие тематики!

  2. admin:

    Илья, спасибо на добром слове.

  3. phobosy:

    Спасибо за статью, я до сих при помощи LIKE искал

Оставьте свой отзыв