Все ленты — последние статьи

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

Полнотекстовой поиск в 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 поддерживает поиск в так называемом логическом режиме, позволяющем задать обязательное отсутствие слова в результатах запроса, изменять величину релевантности для отдельных слов и многое другое.