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

Начиная с версии 3.23.23 в MySQL появилась возможность полнотекстового поиска. Данный тип поиска отличается от простого LIKE тем, что для каждого совпадения возвращает релевантность. Релевантность позволяет отсортировать результаты по значимости (степени сходства между строкой поиска и текстом в поле таблицы).
 
Величина релевантности представляет собой неотрицательное число с плавающей точкой. Релевантность вычисляется на основе количества слов в данной строке столбца, количества уникальных слов в этой строке, общего количества слов в тексте и числа документов (строк), содержащих отдельное слово. Словом является любая последовательность символов, состоящая из букв, чисел, знаков ''' и '_'. Любое слово, присутствующее в стоп-списке (stopword) или просто слишком короткое (3 символа или меньше), игнорируется. Учитывается только полное совпадение слова из строки поиска со словом в поле таблицы.
 
Для того, чтобы воспользоваться полнотекстовым поиском в полях таблицы, нужно создать для этих полей индекс типа FULLTEXT. Эти индексы могут быть созданы в столбцах VARCHAR и TEXT во время создания таблицы командой CREATE TABLE, например:
 
CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
);
 
или добавлены позже с помощью команд ALTER TABLE или CREATE INDEX.
 
Поиск осуществляется с помощью конструкции MATCH(поля) AGAINST('фраза поиска'), где "поля" - это одно или несколько полей таблицы, для которых создан индекс, например MATCH(title,body).
 
Следующий запрос осуществляет поиск текста "поисковая фраза" в заголовке (title) и теле (body) статьи. Результаты сортируются по релевантности, причем статьи, в заголовке которых найдено совпадение будут являться более важными:
 
SELECT `title`, `body`,
(
    MATCH(`title`) AGAINST('поисковая фраза') * 10 +
    MATCH(`body`) AGAINST('поисковая фраза')
) AS `relev`
FROM `имя_таблицы` WHERE
MATCH(`title`) AGAINST('поисковая фраза')
OR
MATCH(`body`) AGAINST('поисковая фраза')
ORDER BY `relev` DESC
 
Как видно из запроса, мы умножили коэффициент совпадения для заголовка на 10, тем самым повысив его значимость.
 
В описанном случае индексы для полей таблицы нужно создавать не вместе FULLTEXT (title,body), а по отдельности FULLTEXT (title) и FULLTEXT (body).
 
В MySQL 4.0.1 возможен полнотекстовый поиск также и в логическом режиме с использованием модификатора IN BOOLEAN MODE. Полезной особенностью данного модификатора является оператор * (звездочка). Используя данный оператор в конструкции MATCH(`title`) AGAINST('про*' IN BOOLEAN MODE) мы получим совпадения для таких слов как "программа", "продукт", "прогресс" и так далее. Релевантность в логическом режиме равняется либо 0 (нет совпадения) либо 1 (есть совпадение).
 
Используя оператор * и стеммер (описание есть в статье на этом сайте) можно предложить алгоритм поиска, в котором стеммер будет отбрасывать от искомого слова окончание, а полученное слово без окончания будет использоваться в конструкции MATCH(поле) AGAINST('слово_без_окончания*' IN BOOLEAN MODE).
 
Подробнее о полнотекстовом поиске и операторах модификатора IN BOOLEAN MODE смотрите в документации к MySQL.


Добавить комментарий

Логин:
Пароль:
Проверочное число: