Мои заметки

  • Как я работаю с заказчиком при создании сайта

    Создание сайта проходит в несколько этапов, требующих действий не только со стороны непосредственно разработчика, но и со стороны заказчика. Чтобы наша совместная работа была более эффективной, я предлагаю следующий алгоритм поэтапного создания сайта.

  • Оптимизация сайта под поисковые системы пошагово.

    Это рассказ о том, как я пытался подстроить сайт по продаже недвижимости в Таиланде в различных поисковиках. Ни в коем случае не руководство

  • Полезные ссылки на память

    Эту заметку я постараюсь периодически обновлять, добавляя сюда инструменты и сайты, которыми пользуюсь при разработке собственных дизайнов. Кроме того, здесь будут ссылки на ресурсы, полезные мне, как начинающему художнику и иллюстратору.

  • Специальные символы HTML

    Таблица специальных символов себе на память, чтобы использовать в последующем где-нибудь в проектах.

Как организовать поиск на сайте, использующем PHP и MySQL

Любой сайт, постоянно пополняемый информацией, рано или поздно начинает нуждаться в модуле поиска. Удобно организованный поиск по сайту - это одна из составляющих успеха сайта в целом.

Как ни странно могло бы показаться, но написание скрипта для поиска - задача отнюдь не настолько уж тривиальная. Подумайте сами, ведь посетитель может ввести слово в некоторой иной форме, чем оно есть на Вашем сайте. Поэтому задача точного поиска вторична. Важнее найти страницы сайта, где упоминается введенное слово в различных формах. То же касается и введенной фразы. Таким образом нам нужно слово с отброшенным окончанием и/или суффиксом (то есть вместо "чаша" необходимо искать "чаш")

Здесь нам и приходит на помощь отличный алгоритм стеммера, класс 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