На главную

RiSearch Pro v.3.2 Manual

© С. Тарасов

Информация для программистов

      Несмотря на то, что основным предназначением скрипта является создание поисковой машины путем индексирования локальных файлов или индексирования сайта через протокол HTTP, скрипт также может использоваться для индексирования специфических баз данных, информация в которых хранится в особом формате, или для интегрирования в программные продукты других компаний, таких как различные системы управления контентом (CMS), форумы и т.п., что позволит управлять поисковым индексом напрямую из этих систем. То есть, возможно автоматическое индксирование новых сообщений в форуме или новых статей на сайте. Все основные функции скрипта вынесены в отдельные модули, что позволяет подключить их к своему скрипту и вызывать из него необходимые функции. Иначе говоря RiSearch Pro можно рассматривать не только как готовое приложение, но и как универсальную библиотеку для построения своих собственных поисковых приложений со специфическими свойствами, необходимыми вам.

      Несколько слов о внутреннем устройстве индекса: начиная с версии RiSearch Pro 3.1 индекс имеет блочную структуру, что в принципе позволяет легко добавлять новые документы в индекс. Но при добавлении отдельных документов блоки будут иметь малый размер, что негативно скажется на скорости поиска для больших сайтов. Поэтому скрипт работает с двумя индексами одинаковой структуры. Основной индекс создается при первоначальной индексации сайта, при этом во время индексации промежуточная информация накапливается в оперативной памяти (размер используемой памяти можно регулировать параметром temp_db_size). При заполнении выделенного блока памяти информация сбрасывается на диск. Чем больше памяти выделяется под временный индекс, тем больший размер в итоге будут иметь блоки индекса, хранящиеся на жестком диске, поэтому рекомендуется выделять не менее 5-10 Мб памяти. Для индексации отдельных документов скрипт создает второй индекс. Информация помещается в этот индекс после каждой проиндексированной страницы, что позволит тут же находить ее через поисковую форму, но и размер блоков, соответственно, сильно уменьшается. Поэтому после добавления нескольких сотен (или тысяч) страниц необходимо объединить индексы (это выполняет скрипт merge.pl). При этом блоки из второго индекса будут объединены и затем добавлены в основной индекс.

      Ниже описан интерфейс основных функций скрипта.

Индексирование

      Для создания индекса необходимо подключить следующие модули:

 use riconfig;
 use lib::common_lib;
 use lib::index_lib;

      Перед началом самого первого индексирования (или при полной переиндексации всех документов) необходимо вызвать функцию start, передав ей хеш со следующими данными - "action" => "index".

      Затем для каждого документа вызывается функция index_file_MEM, передав ей в качестве параметра ссылку на хеш:

 index_file_MEM( \%hash )

      назначение ключей хеша:

  • $hash{text} - текст документа.
  • $hash{url} - URL документа.
  • $hash{TITLE} - заголовок документа.
  • $hash{descript} - краткое описание документа.
  • $hash{date} - дата последнего редактирования или создания документа (в формате unixtime).
  • $hash{size} - размер документа в байтах.
  • $hash{type} - тип документа ("html" или "txt").

      Если указан "html" тип документа, то в документе перед индексацией будут вырезаны теги. Если не указаны параметры $TITLE и $descript, они будут заполнены скриптом (при этом $TITLE примет значение тега TITLE для HTML документа или "No Title" для текстового документа). Обязятельными являются только два первых параметра, остальные могут быть пустыми.

      Для окончания индексирования нужно вызвать функцию finish, передав ей хеш с данными "action" => "index". При этом скрипт скинет на диск оставшиеся в памяти данные и заменит старый индекс новым (при переиндексации).

Добавление нового документа

      Добавить новый документ в индекс можно аналогичным образом. Вызвать функцию start, но на этот раз с параметрами "action" => "add_page". Затем вызвать функцию index_file_MEM (тут все остается без изменений) и для завершения индексации вызвать функцию finish с параметрами "action" => "add_page".

      Если необходимо переиндексировать старый документ, можно перед вызовом функции index_file_MEM выполнить примерно такой код:

my $new_chsum = unpack("%32C*",$$html_text);
my ($url_num,$chsum) = check_url_HD($url);
if ($url_num ne undef) { # такой докумет уже есть в индексе
if ($new_chsum == $chsum) { # текст документа не изменился
print "$url - file was not changed\n";
exit;
} else {
print "\n$url - file was changed and will be reindexed\n";
delete_url($url); # удалить старый документ
print "Url N.$url_num ($url) deleted\n";
}
} else {
print "$url - new file\n";
}



http://risearch.org С.Тарасов, © 2000-2003