IZONE - http://www.izcity.com/ - бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

Поисковый механизм для вашего сайта на PHP

Текст скриптов и тестовых документов можно взять на сайте "ПРОГРАММЫ ДЛЯ БИЗНЕСА"  Скачать исходные тексты>>>

Представьте себе массу HTML документов лежащих в подкаталоге. Пускай ,например ,  это будет каталог договоров вашей организации , перегнанный в html формат и лежащий на интранет сервере вашей организации. Теперь представьте себе что договора раскиданы по папкам. Папки имеют вложенные папки ... Как в этом всем разобраться - а разобравшись не потеряться опять ?
Очень просто ;-) Создайте поисковую систему по вашему сайту..

В этой статье пойдет речь о том как создать  систему поиска по HTML документам на интранет - сайте вашей организации или ( или веб - сайте).

Для начала о принципах работы системы.

Каждый HTML документ, который включается в такую систему, должен иметь специальные мета - теги. Выбор их наименования зависит только от вас, но желательно использовать нестандартные - для обеспечения возможности корректировки ваших HTML документов стандартными средствами - например FrontPage 2000. В принципе это требование не есть обязательным - так как система поиска будет реагировать и на комментарии в тексте документа. Однако удобнее все-таки применять стандартные средства создания мета-тегов.

Итак с чего же начать ? Начать можно с того что ничего не меняя в структуре вашей информации (месторасположении ваших файлов) , добавить в ваши html-документы следующие мета - теги:

<html><head>
<meta docsort="Договор">
<meta docname="Договор о совместной деятельности № 126 от 27.05.2001?.">
..Тут идут другие теги...... 

</head>

Итак вы видите следующие мета - теги (еще раз напомню что выбор их имени полностью зависит от вас - но если вы хотите чтобы данная система поиска  заработала как есть то примените вышеприведенные)

  • docname Здесь находиться описание вашего документа. Фактически поиск идет по этому полю так что надо быть внимательным заполняя его. (Хоть  можно ввести и дополнительное поле поиска по ключевым словам ) )

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

  • Кроме этих вы можете задействовать в поиске и другие мета теги.

Структура поисковой системы выглядит следующим образом :

  • Форма поиска --> Get запрос --> программа на PHP выводящая результаты поиска в виде HTML документа.

В качестве связующего звена при поиске используеться механизм GET  запроса. При котором строка поиска будет передана в строке адреса html документа. Форма для поиска может быть самой простой , например :

<html>
<body>
<form name="main" action="find.php" method="GET">
<input size="25" name="s" value="php">
<input type=submit value="Поиск">
</form>

</body>
</html>

 

Внешний вид формы поиска

 

После того так вы нажимаете на кнопку "Поиск" переменная "s" через GET запрос отправляется в программу поиска написанную на PHP. В этой программе используеться "готовый" класс , в котором собственно и сосредоточена вся функциональность поисковой системы.

Приведем сокращенный текст класса поисковой системы (который удобно разместить в отдельном файле вместе с функциями использующимися в этом классе).

//Исходный текст можно  Скачать на сайте "Программы для Бизнеса".
class search{
//Переменные класса пропущены см. в архиве
function close_search()//Пропущена см. в архиве

//====Рекурсивный проход по каталогу====
function return_htmls($s_in_dir,$what_meta_name,$in_meta_name)
{
//Исключаем служебные каталоги FrontPage 
if (preg_match("/_vti[.]*/i",$s_in_dir)){return;}

if ($dir_handle = @opendir($s_in_dir))
{
while($file = readdir($dir_handle))
{

//Рекурсивный проход по директориям если текущий файл - это директория
if ($file!=".." && $file!="." && is_dir($file))
{
$this->return_htmls($s_in_dir."/".$file,$what_meta_name,$in_meta_name);
}

//Проход по *.ht* файлам в одной директории
if (!is_dir($file) && $file!=".." && $file!="." && preg_match("/[.]*\.ht[.]*/i",$file))
{

// Получаем мета-тег docsort
// Функция cyr_up (см. В архиве ) служит для приведения
// маленьких символов кириллицы к прописным и для 
// замены совпадающих символов кириллицы и латинского алфавита
// на латинские прописные
$str_meta_sort=cyr_up(GetMeta("docsort",$s_in_dir."/".$file));

//Если задан поиск по мета-тегам (иначе не будет поиска)
//Введено для возможности расширения функций программы
if ($in_meta_name){
//Имя без типа - для вывода
$str_meta_name=cyr_up(GetMeta("docname",$s_in_dir."/".$file));

//Включаем тип документа - для поиска
$str_meta_name1=$str_meta_name." ".$str_meta_sort; 

//Создаем массив токенов (слов) из входного запроса (переменной формы)
$token_arr=split('[+ ]',$what_meta_name);

//Убиваем повторяющиеся токены
$token_arr=array_keys(array_count_values($token_arr));

//Количество присутствующих в строке токенов
$tok_founded=0;

//Всего токенов найдено
$all_founded=0;


//Поиск
for ($j=0;$j<count($token_arr);$j++)
{
if ($all_founded+=preg_match_all("/".cyr_up($token_arr[$j])."/i",cyr_up($str_meta_name1),$matches_arr))
$tok_founded++;
}

//Вывод токенов
if ($tok_founded==count($token_arr) && strlen(trim($what_meta_name))!=0 && strlen(trim($str_meta_name))!=0){

//Тут выделяем токены красным цветом
for ($j=0;$j<count($token_arr);$j++)
{
$str_meta_name=preg_replace("/(".cyr_up($token_arr[$j]).")/i","<font color=\"red\">\\1</font>",cyr_up($str_meta_name));
$str_meta_sort=preg_replace("/(".cyr_up($token_arr[$j]).")/i","<font color=\"red\">\\1</font>",cyr_up($str_meta_sort));
}
echo "<li><p class=\"B\"><a class=\"n\" href=\"".$s_in_dir."/".$file."\">/$this->count.<b>$str_meta_sort</b> \"$str_meta_name\" /$all_founded/</a></li><br></p>\n";
$this->found_in_metaname++;
$this->count++;
}

}


}

closedir($dir_handle);
}

}


//end class
}
?>
<html>
<link rel="stylesheet" type="text/css" href="css/sm.css">
<body>
<?
$qu = getenv("QUERY_STRING");parse_str(substr($qu,0,100));
if (!isset($s)){$s="";};
//echo ();

$s=preg_replace("/[\\041-\\055\/]*/","",$s);
$s=preg_replace("/\./","\\\056",$s);


$show=new search;
$show->count=1;
$show->found_in_metaname=0;
$show->return_htmls(".",$s,1);
$show->close_search();
?>
</body>
</html>

Для перебора всех файлов в каталоге класса return_htmls(".",$s,1); В качестве параметров ей передаеться имя начального каталога (с которого начинать обход) , поисковая строка и флаг (поиск в мета - тегах) который должен быть равен 1 - для поиска в мета тегах.

  • Алгоритм работы функции следующий:
    Функция проходит текущий каталог и если находит файл то берет его мета- теги и ищет в них ключевые слова. Поиск ведеться с помощью RegExp -ов следующим кодом:
    //Поиск
    for ($j=0;$j<count($token_arr);$j++)
    {
    if ($all_founded+=preg_match_all("/".cyr_up($token_arr[$j])."/i",cyr_up($str_meta_name1),$matches_arr))
    $tok_founded++;
    }
    Функция  preg_match_all производит Perl-совместимый полный поиск в мета - тегах документа ( $str_meta_name1)

  • Если слова найдены то выводит производиться "подсветка" мета-тегов с помощью :
    for ($j=0;$j<count($token_arr);$j++)
    {
    $str_meta_name=preg_replace("/(".cyr_up($token_arr[$j]).")/i","<font color=\"red\">\\1</font>",cyr_up($str_meta_name));
    $str_meta_sort=preg_replace("/(".cyr_up($token_arr[$j]).")/i","<font color=\"red\">\\1</font>",cyr_up($str_meta_sort));
    }
    Используется функция функция замены по регулярному выражению  preg_replace () которая производит замену найденых токенов на них же только выделенных красным цветом (<font color=\"red\">\\1</font>) 

  • и вывод в html ссылки на документ. В конце выводиться количество найденых токенов в мета - тегах документа. 

  • Если же файл являеться директорией то функция вызывает саму себя но в качестве параметров передает уже новое имя директории + флаги поиска :
     if ($file!=".." && $file!="." && is_dir($file))
    {
    $this->return_htmls($s_in_dir."/".$file,$what_meta_name,$in_meta_name);
    }

  • Цикл продолжается пока не будут пройдены все файлы и каталоги указанные при вызове функции.

Поиск ведеться по нескольким словам. Для разбиения поисковой фразы на токены (слова) применяется следующий код:

  • //Создаем массив токенов (слов) из входного запроса (переменной формы)
    $token_arr=split('[+ ]',$what_meta_name);

  • //Убиваем повторяющиеся токены 
    $token_arr=array_keys(array_count_values($token_arr));

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

  • Ссылки по теме: 
    - Текст скриптов из данной статьи можно  взять в архиве сайта  Скачать >>>
    - Статьи по PHP на сервере "Программы для бизнеса" Перейти >>>
    - Раздел "ИнтраNET" на сервере "Программы для бизнеса" Перейти >>>
    - Раздел "Программирование" на сервере "Программы для бизнеса" Перейти >>>

В конце статьи хочется отметить что программа работает как на Windows так и на UNIX , благодаря применению функций приведения мета-тегов и строки запроса к верхнему регистру. Кроме того из поиска исключаться стандартные каталоги FrontPage 2000  (с помощью:  if (preg_match("/_vti[.]*/i",$s_in_dir)){return;} ).

03.06.2001 - Arsen Kirillov

 


Copyright © "Internet Zone"info@izcity.com
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас.