Полнотекстовый поиск в 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.
Статьи с похожими тегами ↓
Работа в Киеве, работа в Москве: менеджер, программист, юрист. Горячие вакансии. — Безработных.Нет
Салаты, дессерты, торты, рыбные, мясные, блюда из овощей, птицы, рецепты блюд

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