Текст скриптов и
тестовых документов можно взять на
сайте "ПРОГРАММЫ ДЛЯ БИЗНЕСА" Скачать
исходные тексты>>>
Представьте
себе массу HTML документов лежащих в
подкаталоге. Пускай ,например , это
будет каталог договоров вашей
организации , перегнанный в html формат и
лежащий на интранет сервере вашей
организации. Теперь представьте себе
что договора раскиданы по папкам. Папки
имеют вложенные папки ... Как в этом всем
разобраться - а разобравшись не
потеряться опять ?
Очень просто ;-) Создайте поисковую
систему по вашему сайту..
В этой статье
пойдет речь о том как создать систему
поиска по HTML документам на интранет -
сайте вашей организации или ( или веб -
сайте).
Для начала о
принципах работы системы.
Каждый HTML
документ, который включается в такую
систему, должен иметь специальные мета -
теги. Выбор их наименования зависит
только от вас, но желательно
использовать нестандартные - для
обеспечения возможности корректировки
ваших HTML документов стандартными
средствами - например FrontPage 2000. В
принципе это требование не есть
обязательным - так как система поиска
будет реагировать и на комментарии в
тексте документа. Однако удобнее все-таки
применять стандартные средства
создания мета-тегов.
Итак с чего же
начать ? Начать можно с того что ничего
не меняя в структуре вашей информации (месторасположении
ваших файлов) , добавить в ваши html-документы
следующие мета - теги:
<html><head>
<meta docsort="Договор">
<meta docname="Договор о совместной
деятельности № 126 от 27.05.2001?.">
..Тут идут другие теги......
</head>
|
Итак вы видите
следующие мета - теги (еще раз напомню
что выбор их имени полностью зависит от
вас - но если вы хотите чтобы данная
система поиска заработала как есть
то примените вышеприведенные)
-
docname Здесь
находиться описание вашего документа.
Фактически поиск идет по этому полю
так что надо быть внимательным
заполняя его. (Хоть можно ввести и
дополнительное поле поиска по
ключевым словам ) )
-
doctype - Вид
документа . Здесь вы можете написать
что-то вроде кодифицированного вами
типа документа например "Договор"
, "Приложение", "Контракт" ...
По этому полю также ведется поиск (перед
решающим сравнением эти два поля "склеиваются"
через пробел в одну строку)
Структура
поисковой системы выглядит следующим
образом :
В качестве
связующего звена при поиске
используеться механизм 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));
Повторяющиеся
токены забираются как для того чтобы
ускорить поиск , -так и для того чтобы не
было ошибок при выделении токенов в
результатах поиска.
В конце статьи
хочется отметить что программа работает
как на Windows так и на UNIX , благодаря
применению функций приведения мета-тегов
и строки запроса к верхнему регистру.
Кроме того из поиска исключаться
стандартные каталоги FrontPage 2000 (с
помощью: if (preg_match("/_vti[.]*/i",$s_in_dir)){return;}
).
03.06.2001 - Arsen Kirillov
|