Любой сайт, постоянно пополняемый информацией, рано или поздно начинает нуждаться в модуле поиска. Удобно организованный поиск по сайту - это одна из составляющих успеха сайта в целом.
Как ни странно могло бы показаться, но написание скрипта для поиска - задача отнюдь не настолько уж тривиальная. Подумайте сами, ведь посетитель может ввести слово в некоторой иной форме, чем оно есть на Вашем сайте. Поэтому задача точного поиска вторична. Важнее найти страницы сайта, где упоминается введенное слово в различных формах. То же касается и введенной фразы. Таким образом нам нужно слово с отброшенным окончанием и/или суффиксом (то есть вместо "чаша" необходимо искать "чаш")
Здесь нам и приходит на помощь отличный алгоритм стеммера, класс Lingua_Stem_Ru, написанный на PHP. Он имеет ряд своих недостатков, но тем не менее, довольно хорошо подходит под поставленную задачу.
Использовать этот класс можно следующим образом
require_once('stemmer.php');
$stemmer = new Lingua_Stem_Ru();
Первой строкой мы подключили файл с классом, а во второй создали экземпляр класса с именем stemmer.
Допустим, что введенная пользователем фраза содержится в переменной $_GET['q'], тогда для разбиения фразы на слова нам нужно сделать следующую манипуляцию:
$words = explode(" ", $_GET['q']); // разбиваем исходную строку на массив слов
Теперь нам необходимо составить запрос к Базе Данных. Допустим, что у нас есть таблица
PAGE | |
id | int() primary key |
name | varchar(200) |
content | text |
Тогда запрос можно составить следующим образом:
$sql_text = "SELECT distinct * FROM PAGE WHERE "; //Начало запроса
foreach ($words as $value)
{
// для каждого слова получаем его бессуфиксно-безокончательную часть =)
$svalue = $stemmer->stem_word($value);
// добавляем в $sql-запрос
$sql_text.= 'name LIKE \'%'.$svalue.'%\' or content LIKE \'%'.$svalue.'%\' or ';
}
// удаляем лишний "or" в конце строки
$sql_text = ereg_replace(' or $', '', $sql_text);
$sql = mysql_query($sql_text);
Результатом выполнения sql-запроса станет список страниц, в названии или тексте которых встречается одно из слов поисковой фразы.
На данном простом примере мы рассмотрели применение стеммера для организации поиска по сайту с использованием PHP и MySQL. Конечно, это очень упрощённый вариант поиска. В этой статье я не упомянул обязательную проверку введенного пользователем значения, индексирования поиска, учёта логических "и" и "или" при обработке запроса пользователя и т.д. Возможно, эти моменты будут рассмотрены позже.
comments powered by Disqus