Полнотекстовый поиск
Полнотекстовый поиск в СУБД MySQL на сегодняшний день поддерживается
только для таблиц типа MylSAM и только для текстовых столбцов переменной длины (TEXT И VARCHAR). Эта возможность активируется созданием индекса
типа FULLTEXT ДЛЯ столбцов, по которым необходимо осуществлять поиск.
Полнотекстовый поиск в СУБД MySQL не чувствителен к регистру. Кроме
того, при поиске игнорируются так называемые "общеупотребительные"
слова. К ним относятся слишком короткие слова (по умолчанию состоящие
меньше, чем из четырех символов), а также слова, встречающиеся, по
крайней мере, в половине записей. Так если в таблице имеются только две
записи, то поиск не даст результатов, поскольку каждое слово будет
присутствовать в половине записей.
Для использования возможности полнотекстового поиска в таблице,
содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи SQL-оператора ALTER. В
листинге ниже для текстового поля name таблицы table_author создается
индекс FULLTEXT.
ALTER TABLE table_author ADD FULLTEXT name (name);
В листинге сразу после ключевого слова FULLTEXT следует имя
создаваемого индекса, за которым в скобках указано имя текстового
столбца.
Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через
запятую:
ALTER TABLE table_author ADD FULLTEXT name (name, description);
Если индекс создается только по одному столбцу и его имя совпадает с
именем столбца, то имя индекса, размещаемое после ключевого слова
FULLTEXT, можно опустить.
На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:
ALTER TABLE table_author ADD FULLTEXT (name),
ADD FULLTEXT (description),
ADD FULLTEXT together (name, description);
Поиск выполняется при помощи встроенной функции MATCH(), в качестве
аргумента которой выступает один или более индексов типа FULLTEXT, а
также функции AGAINST (), которая принимает в качестве аргумента искомую строку:
Оператор SELECT, осуществляющий полнотекстовый поиск
SELECT * FROM table_author WHERE MATCH(name) AGAINST(`программирование`);
В листинге из таблицы table_author извлекаются все записи,
соответствующие статьям, в названии которых встречается слово
"программирование". Синтаксис допускает использование нескольких
конструкций MATCH() — AGAINST() после оператора WHERE, разделенных
логическими операторами OR ИЛИ AND
SELECT * FROM table_author WHERE MATCH(name) AGAINST(`программирование`)
OR MATCH(name) AGAINST(`кодирование`);
В листинге из таблицы table_author извлекаются все записи,
соответствующие статьям, в теле которых присутствует либо слово
"программирование", либо слово "кодирование".
Результаты поиска сортируются в порядке уменьшения релевантности.
Величина релевантности представляет собой неотрицательное число с
плавающей точкой. Релевантность вычисляется на основе количества слов в
данной строке столбца, количества уникальных слов в этой строке, общего
количества слов в тексте и числа документов (строк), содержащих
отдельное слово.
Начиная с версии 4.0.1, СУБД MySQL поддерживает поиск в так
называемом логическом режиме, позволяющем задать обязательное отсутствие слова в результатах запроса, изменять величину релевантности для
отдельных слов и многое другое.
PHP поиск
Пример использования полнотекстового поиска в PHP
Допустим, в нашей базе есть столбец article_content с индексом
FULLTEXT. Приведем пример полнотекстового поиска всех записей, где
встречается выражение «php поиск»:
<?
require(`config.php`); //Устанавливаеем соединение с базой
$query = " SELECT * FROM articles WHERE MATCH(article_content) AGAINST(`php поиск`) ";
$zapros = mysql_query($query);
while ($data = mysql_fetch_assoc($zapros)) {
print_r($data);
}
?>