<!doctype linuxdoc system>

<article>

<title>Документация пользователя Harvest
<author>
Darren R. Hardy, Michael F. Schwartz, Duane Wessels, Kang-Jin Lee

<date>2002-09-04

<abstract>
Документация пользователя Harvest была отредактирована Kang-Jin Lee
и относится к Harvest version 1.8. Первоначально она
была написана Darren R. Hardy, Michael F. Schwartz и Duane Wessels
для Harvest 1.4.pl2 31 января 1996г.

<toc>

<sect>Введение в Harvest

<p>
HARVEST - это объединенный набор средств для собирания,
извлечения, систематизирования и
поиска информации в Internet. Небольшими усилиями
пользователи могут адаптировать
Harvest для систематизации информации в различных
форматах и предложить свои услуги поиска в Internet.

Главная задача Harvest - предоставить гибкую систему,
которая может быть настроена
различными способами для создания большого числа типов индексов.

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

Важное преимущество Harvest заключается в том, что он позволяет
пользователям строить индексы
используя или свои шаблоны (для максимального контроля над
содержанием индекса), или созданные автоматически шаблоны
извлеченных данных (для легкого охвата больших коллекций),
смесь этих двух способов.

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

<sect1>Copyright

<p>
Ядро Harvest находится под лицензией
<url url="http://harvest.sourceforge.net/harvest/COPYING" name="GPL">.
Дополнительные компоненты, поставляемые вместе с Harvest,
также находятся под GPL или похожими лицензиями.
Glimpse, на данный момент используемая по умолчанию
полнотекстовая система индексации имеет другую лицензию.
Вот прояснение
<url url="http://harvest.sourceforge.net/harvest/doc/glimpse-license-status"
name="статуса авторского права Glimpse">,
любезно предоставленное <url url="mailto:gvelez@tucson.com" name="Golda
Velez"> в
<url url="news:comp.infosystems.harvest" name="comp.infosystems.harvest">.

<sect1>Ресурсы Harvest Online

<p>
Эта документация доступна на
<htmlurl
url="http://harvest.sourceforge.net/harvest/doc/html/manual.html"
name="harvest.sourceforge.net/harvest/doc/html/manual.html">.

Болле подробную информацию о Harvest можно получить на
<htmlurl url="http://harvest.sourceforge.net/"
name="harvest.sourceforge.net">.

<sect>Обзор подсистем

<p>
Harvest состоит из нескольких подсистем. Подсистема <em>Gatherer</em>
собирает индексируемую информацию (такую как ключевые слова, имена авторов и заголовки) с
ресурсов, доступных на сайтах <em>Provider</em>'ов (таких как FTP и HTTP
сервера). Подсистема <em>Broker</em> получает индексируемую информацию от одного
или нескольких Gatherer'ов, избавляется от повторной информации, постепенно индексирует
собранную информацию и предоставляет WWW интерфейс для запросов к нему.

<label id="img1">
<figure loc="tbp">
<eps file="../images/img1.eps" height="10cm">
<img src="../images/img1.png">
<caption>Компоненты ПО Harvest</caption>
</figure>

Следует начать использование Harvest просто установив один ``готовый''
(т.е. не настроенный) Gatherer и Broker на одну машину для индексирования некоторых
FTP, World Wide Web и NetNews данных на вашем сайте.

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

Мы обсудим, как распределить процесс сбора в следующем разделе. Мы
охватим различные формы настройки в разделе
<ref id="Customizing the type recognition, candidate selection, presentation unnesting, and summarizing steps"
name="Настройка распознавания типов, выбора кандидатов, представление разбора и суммирование">
и в разных частях раздела
<ref id="The Broker" name="Broker">.

<sect1>Распределение процессов Gathering и Brokering

<p>
Harvest Gatherer'ы и Broker'ы могут быть сконфигурированы различными способами.
Запуск Gatherer'а удаленно с сайта провайдера позволяет Harvest'у
взаимодействовать с сайтами, не использующими
Harvest Gatherer'ы, используя стандартные протоколы
получения объектов как FTP, Gopher, HTTP, and NNTP.
Однако, как показано толстыми линиями слева на рисунке
<ref id="img2" name="2">,
такое расположение приводит к излишку нагрузки
сервера и сети. Запуск Gatherer'а
локально более эффективно, как показано
справа на рисунке
<ref id="img2" name="2">.
Тем не менее, запускать Gatherer'ы удаленно все же лучше,
чем иметь много сайтов,
независимо собирающих индексируемую информацию,
так как много Broker'ов или других поисковых
служб могут совместно использовать индексируемую информацию,
которую собирает Gatherer.

Если у вас есть много FTP/HTTP/Gopher/NNTP серверов
на вашем сайте, то наиболее правильно
запустить Gatherer на каждой машине, где есть сервер.
С другой стороны, вы можете уменьшить усилия на установку,
запустив Gatherer всего на одной машине на вашем сайте и
позволив ему получить данные по сети.

<label id="img2">
<figure loc="tbp">
<eps file="../images/img2.eps" height="10cm">
<img src="../images/img2.png">
<caption>Варианты конфигурации Harvest</caption>
</figure>

Рисунок <ref id="img2" name="2">
также показывает, что Broker может собирать информацию от
нескольких Gatherer'ов (чтобы построить индекс широко
разбросанной информации). Broker'ы могут также получать информацию
от других Broker'ов, в сущности передавая проиндексированную
информацию друг другу. Broker'ы получают эту информацию,
используя интерфейс запросов, позволяя фильтровать или
очищать информацию от одного Broker'а к другому.

<sect>Установка ПО Harvest
<label id="Installing the Harvest Software">

<p>

<sect1>Требования к серверам Harvest

<p>

<sect2>``Железо''

<p>
Хорошая машина для запуска обычного сервера Harvest
должна иметь достаточно быстрый процессор, 1-2 GB
свободного дискового пространства и 128 MB RAM.
Медленный процессор будет работать, но будет сильно
тормозить сервер Harvest. Однако, размер памяти важнее
чем скорость процессора. Harvest использует много процессов,
некоторые из которых предоставляют необходимую ``связь''
(т.е., например, <tt>search.cgi</tt> связывает пользователя
с брокером), а некоторые улучшают производительность
(например, процесс <tt>glimpseserver</tt> ).
Если у вас недостаточно памяти, ваша система будет
слишком много записываться на диск и значительно уменьшит
производительность. Другой фактор, влияющий на использование RAM,
заключается в том, сколько вы пытаетесь проиндексировать
брокером Harvest. Чем больше данных, тем больше будет
выполняться операций ввода/вывода за время запроса, и тем больше
памяти будет занято, чтобы предоставить дисковый буфер разумного размера.

Количество места на диске, которое вам понадобится зависит от того,
сколько данных вы хотите проиндексировать одним брокером.
(Можно распределить ваш индекс на несколько брокеров,
если одного диска становится недостаточно.) Опыт показывает,
что вам понадобится места на диске около 10% от общего размера данных,
подлежащих индексированию, для содержания Gatherer'а и Broker'а.
Реальные размеры будут зависеть от типа данных, которые вы индексируете.
Например, PostScript достигает значительно большего уменьшения
индексного пространства, чем HTML, потому что очень много информации
в PostScript (такой как информация о расстановке страниц)
отбрасывается при построении индекса.

<sect2>Платформы

<p>
Для того, чтобы запустить сервер Harvest, вам нужна UNIX-подобная операционная система.

<sect2>ПО

<p>
Для использования Harvest вам необходимы следующие программные пакеты:

<itemize>
<item>Все сервера Harvest требуют: Perl v5.0 или выше.
<item>Harvest Broker и Gatherer требуют: GNU <tt>gzip</tt> v1.2.4 или выше.
<item>Harvest Broker требует: HTTP сервер.
</itemize>

Для того, чтобы собрать Harvest из дистрибутива с исходниками,
вам может понадобиться установить один или больше из следующих
программных пакетов:

<itemize>
<item>Для компилирования Harvest необходимо: GNU <tt>gcc</tt> v2.5.8 или выше.
<item>Для компилирования брокера Harvest необходимо: <tt>flex</tt> v2.4.7
или выше и <tt>bison</tt> v1.22 или выше.
</itemize>

Исходники <tt>gcc</tt>, <tt>gzip</tt>, <tt>flex</tt> и <tt>bison</tt>
можно взять на <url url="ftp://ftp.gnu.org/" name="GNU FTP сервере">.

<sect1>Требования к пользователям Harvest

<p>
Любой, у кого есть веб-броузер (например, Internet Explorer,
Lynx, Mozilla, Netscape, Opera и др.), может использовать
сервера Harvest.

<sect1>Получение и установка ПО Harvest

<p>

<sect2>Типы дистрибутивов

<p>
Сейчас мы предлагаем только один дистрибутив с исходниками Harvest.
<em>Дистрибутив с исходниками</em> содержит весь исходный код
для ПО Harvest. Нет <em>бинарных дистрибутивов</em> Harvest'а.

Вы можете получить дистрибутивы с исходниками Harvest на
странице загрузки Harvest
<htmlurl url="http://prdownloads.sourceforge.net/harvest/"
name="prdownloads.sourceforge.net/harvest/">.

<sect2>Компоненты Harvest

<p>
Компоненты Harvest находятся в каталоге <em>components</em>.
Чтобы использовать компонент, следуйте инструкциям,
находящимся в каталоге соответствующего компонента.

<sect2>Программное обеспечение, созданное пользователями

<p>
Существует коллекция неподдерживаемого ПО, созданного
пользователями в каталоге <em>contrib</em>.
Если вы хотите внести свой вклад и предоставить ваше ПО,
отправьте, пожалуйста, письмо на
<url url="mailto:lee@arco.de" name="lee@arco.de">.

<sect1>Компилирование исходников

<p>
Дистрибутив с исходниками можно извлечь в любой каталог.
Следующая команда извлечет архив gnu-zip с исходниками:

<tscreen><verb>
        % gzip -dc harvest-x.y.z.tar.gz | tar xf -
</verb></tscreen>

Для архивов, сжатых при помощи bzip2, используйте:

<tscreen><verb>
        % bzip2 -dc harvest-x.y.z.tar.bz2 | tar xf -
</verb></tscreen>

Harvest использует пакеты GNU <em>autoconf</em>
для предоставления необходимой конфигурации в процессе установки.
Если вы хотите заменить место установки по умолчанию
<em>/usr/local/harvest</em>, измените переменную ``prefix'' при запуске ``configure''.
При желании можете отредактировать
<em>src/common/include/config.h</em> перед компиляцией,
чтобы изменить различные переменные и ограничения времени
компиляции Harvest'а. Чтобы скомпилировать дерево исходников,
наберите <tt>make</tt>.

Например, чтобы построить и установить полную систему Harvest
в каталог <em>/usr/local/harvest</em> , наберите:

<tscreen><verb>
        % ./configure
        % make
        % make install
</verb></tscreen>

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

Построение полного дистрибутива Harvest займет несколько минут
на достаточно быстрой машине. Скомпилированное дерево исходников
занимает примерно 25 мегабайт дискового пространства.

Потом, после того, как заработает установленное ПО,
вы можете удалить скомпилированный код (файлы ".o")
и прочие промежуточные файлы, набрав <tt>make clean</tt>.
Если вы хотите удалить файлы, созданные configure (Makefiles),
наберите <tt>make distclean</tt>.

<sect1>Дополнительная установка для Harvest Broker
<label id="Additional installation for the Harvest Broker">

<p>

<sect2>Проверка установки на возможность HTTP доступа

<p>
Broker взаимодействует с вашим сервером HTTP различными способами.
Следует убедиться, что сервер HTTP имеет необходимый доступ
к нужным ему файлам. Часто сервер HTTP запускается пользователем,
не являющимся владельцем файлов Harvest.

Во-первых, убедитесь, что userid сервера HTTP может прочитать файлы
<em>query.html</em> в каталогах каждого брокера.
Во-вторых, убедитесь, что userid сервера HTTP имеет доступ
и может запустить программы CGI в <em>$HARVEST_HOME/cgi-bin/</em>.
Скрипт <tt>search.cgi</tt> читает файлы из каталога
<em>$HARVEST_HOME/cgi-bin/lib/</em>, так что проверьте его тоже.
Наконец, проверьте файлы в <em>$HARVEST_HOME/lib/</em>.
Некторые скрипты Perl CGI требуют файлы ``include'' в этом каталоге.

The Broker interacts with your HTTP server in a number of ways.
You should make sure that the HTTP server can properly access
the files it needs.  In many cases, the HTTP server will run
under a different userid than the owner of the Harvest files.

<sect2>Необходимые изменения вашего сервера HTTP

<p>

Harvest Broker требует, чтобы был запущен сервер HTTP,
и чтобы сервер HTTP ``знал'' о файлах Broker'а.
Ниже приведено несколько примеров того, как настроить
различные сервера HTTP для работы с Harvest Broker.

<sect2>Apache httpd

<p>
Требует <bf>ScriptAlias</bf> и <bf>Alias</bf> записи в
<em>httpd.conf</em>, например:

<tscreen><verb>
        ScriptAlias /Harvest/cgi-bin/ Your-HARVEST_HOME/cgi-bin/
        Alias /Harvest/ Your-HARVEST_HOME/
</verb></tscreen>

<em>ВНИМАНИЕ:</em> Запись <bf>ScriptAlias</bf> должна появиться
<em>перед</em> записью <bf>Alias</bf>.

Дополнительно может оказаться необходимым настроить
Apache httpd, чтобы он следовал
<em>по символическим сылкам</em>.
Чтобы сделать это, добавьте следующее в ваш <em>httpd.conf</em>:

<tscreen><verb>
        &lt;Directory Your-HARVEST_HOME&gt;
                Options FollowSymLinks
        &lt;/Directory&gt;
</verb></tscreen>

<sect2>Другие сервера HTTP

<p>

Установите сервер HTTP и измените его конфигурационный файл так,
чтобы каталог <em>/Harvest</em> указывал на
<em>$HARVEST_HOME</em>. Вам также понадобится настроить
ваш сервер HTTP так, чтобы он знал, что каталог
<em>/Harvest/cgi-bin</em> содержит программы CGI.
Если по умолчанию ваш сервер не следует по символическим ссылкам,
вам нужно настроить его так, чтобы он следовал по символическим
ссылкам в каталоге <em>/Harvest</em>.

<sect1>Модернизация ПО Harvest

<p>

<sect2>Переход от версии 1.6 до версии 1.8

<p>

<em>Нельзя</em> устанавливать версию 1.8 поверх версии 1.6.
Например, изменения версии 1.8 по сравнению с 1.6 включают
некоторую реорганизацию  исполняемых файлов, и, следовательно,
простая установка версии 1.8 поверх версии 1.6 приведет в
некоторых случаях к использованию старых исполняемых файлов.

Для перехода Harvest'а с версии 1.6 до 1.8:

<enum>
<item>Переместите старую установку во временный каталог.
<item>Установите новую версию, руководствуясь инструкцией, поставляемой с Harvest'ом.
<item>Потом, для каждого Gatherer'а и Broker'а, которые вы запускали в старой
      инсталляции, переместите сервер на новую инсталляцию.

      <descrip>
      <tag/Gatherer'ы:/
      необходимо переместить каталог Gatherer'а в
      <em>$HARVEST_HOME/gatherers</em>.
      Раздел <ref id="RootNode specifications"
      name="Описание RootNode">
      показывает специфику загрузки Gatherer'а,
      если вы хотите внести изменения в конфигурационный файл вашего Gatherer'а.

      <tag/Broker'ы:/
      переделайте ваш Broker, используя <tt>CreateBroker</tt>,
      и сделайте все настройки, которые были у вашего старого Broker'а.
      </descrip>

</enum>

<sect2>Переход от версии 1.5 до версии 1.6

<p>
Нет никаких известных несовместимостей между версиями 1.5 и 1.6.

<sect2>Переход от версии 1.4 до версии 1.5

<p>
<em>Нельзя</em> устанавливать версию 1.5 поверх версии 1.4.
Например, изменения версии 1.5 по сравнению с 1.4 включают
некоторую реорганизацию  исполняемых файлов, и, следовательно,
простая установка версии 1.5 поверх версии 1.4 приведет в
некоторых случаях к использованию старых исполняемых файлов.

Для перехода Harvest'а с версии 1.4 до 1.5:

<enum>
<item>Переместите старую установку во временный каталог.
<item>Установите новую версию, руководствуясь инструкцией, поставляемой с Harvest'ом.
<item>Потом, для каждого Gatherer'а и Broker'а, которые вы запускали в старой
      инсталляции, переместите сервер на новую инсталляцию.

      <descrip>
      <tag/Gatherer'ы:/
      необходимо переместить каталог Gatherer'а в
      <em>$HARVEST_HOME/gatherers</em>.
      Раздел <ref id="RootNode specifications"
      name="Описание RootNode">
      показывает специфику загрузки Gatherer'а,
      если вы хотите внести изменения в конфигурационный файл вашего Gatherer'а.

      <tag/Broker'ы:/
      необходимо переместить каталог Broker'а в <em>$HARVEST_HOME/brokers</em>.
      Удалите все файлы <em>.glimpse_*</em> из каталога вашего Broker'а
      и используйте интерфейс <em>admin.html</em> для полного индексирования.
      Возможно, вы захотите перестроить ваш Broker,
      используя <tt>CreateBroker</tt>, после чего вы
      сможете использовать новый <em>query.html</em>
      и связанные с ним файлы.
      </descrip>

</enum>

<sect2>Переход от версии 1.3 до версии 1.4

<p>
Нет никаких известных несовместимостей между версиями 1.3 и 1.4.

<sect2>Переход от версии 1.2 до версии 1.3

<p>
Версия 1.3 почти полностью обратно совместима с 1.2
со следующим исключением:

Harvest 1.3 использует 3.0. Файлы <em>.glimpse_*</em>
в каталоге брокера, созданные при помощи Harvest 1.2 (Glimpse 2.0),

<enum>
<item>Закрыть все запущенные брокеры.
<item>Выполнить <tt>rm .glimpse_*</tt> в каталогах каждого брокера.
<item>Перезапустить ваши брокеры командой <tt>RunBroker</tt>.
<item>Выполните полное индексирование при помощи интерфейса <em>admin.html</em>.
</enum>

<sect2>Переход от версии 1.1 до версии 1.2

<p>
Есть несколько несовместимостей между версиями Harvest 1.1 и 1.2.

<itemize>
<item>У Gatherer'а есть улучшенная поддержка возрастающего сбора,
      которая несовместима с версией 1.1.
      Для обновления вашего существующего Gatherer'а зайдите в
      <em>каталог данных</em> Gatherer'а (обычно подкаталог <em>data</em>)
      и запустите следующую команду:

      <tscreen><verb>
        % set path = ($HARVEST_HOME/lib/gatherer $path)
        % cd data
        % rm -f INDEX.gdbm
        % mkindex
      </verb></tscreen>

      Должны создаться файлы <em>INDEX.gdbm</em> и <em>MD5.gdbm</em>
      в текущем каталоге.
<item>У Broker'а есть новый формат логов для файла <em>admin/LOG</em>,
      который несовместим с версией 1.1.
</itemize>

<sect2>Переход к версии 1.1 с версии 1.0 или более ранних версий

<p>
Если у вас уже установлена более рання версия Harvest,
и вы хотите ее обновить, то <em>нельзя</em> распаковывать
новый дистрибутив поверх старого. Например, изменения
версии 1.1 по сравнению с 1.0 включают некоторую реорганизацию
исполняемых файлов, и, следовательно, простая установка версии 1.1
поверх версии 1.0 приведет в некоторых случаях к использованию
старых исполняемых файлов.

С другой стороны, возможно вы
не захотите устанавливать с нуля новую версию, так как вы уже
собрали и проиндексировали большое число данных.
Вместо этого, для перехода с версии Harvest 1.0 до 1.1
проделайте следующее:

<enum>
<item>Переместите старую установку во временный каталог.
<item>Установите новую версию, руководствуясь инструкцией,
      поставляемой с Harvest'ом.
<item>Потом, для каждого Gatherer'а и Broker'а, которые
      вы запускали в старой инсталляции, переместите
      сервер на новую инсталляцию.

      <descrip>
      <tag/Gatherer'ы:/
      необходимо переместить каталог Gatherer'а в
      <em>$HARVEST_HOME/gatherers</em>. Раздел
      <ref id="RootNode specifications"
      name="Описание RootNode">
      показывает специфику загрузки Gatherer'а,
      если вы хотите внести изменения в конфигурационный файл
      вашего Gatherer'а.

      <tag/Broker'ы:/
      необходимо переместить каталог Broker'а в
      <em>$HARVEST_HOME/brokers</em>.
      Возможно, вы захотите перестроить ваш брокер,
      используя <tt>CreateBroker</tt>,
      чтобы можно было использовать обновленный <em>query.html</em>
      и связанные с ним файлы.
      </descrip>

</enum>

<sect1>Запуск системы: команда RunHarvest и связанные с ней команды
<label id="Starting up the system: RunHarvest and related commands">

<p>
Простейший способ запуска системы Harvest - использовать команду
<tt>RunHarvest</tt>. <tt>RunHarvest</tt> предлагает пользователю
ответить на небольшой список вопросов о том, какие данные
индексировать и проч., и затем создает и запускает Gatherer
и Broker со стандартным (не настроенным) набором механизмов
извлечения содержимого и индексирования. Имеется несколько
более простых команд для запуска отдельных Gatherer'ов и Broker'ов
(например, если вы хотите распределить процесс собирания).
Команды запуска Harvest'а:

<descrip>
<tag/RunHarvest/
Проверяет, корректно ли установлено ПО Harvest,
спрашивает у пользователя   основную конфигурационную
информацию и затем создает и запускает Gatherer и   Broker.
Если у вас установлена переменная <em>$HARVEST_HOME</em>,
тогда команда использует ее;   в противном случае она попытается
определить <em>$HARVEST_HOME</em> автоматически.
Находится   в каталоге <em>$HARVEST_HOME</em>.

<tag/RunBroker/
Запускает Broker. Находится в каталоге Broker'а.

<tag/RunGatherer/
Запускает Gatherer. Находится в каталоге Gatherer'а.

<tag/CreateBroker/
Создает отдельный Broker, который будет собирать
свою информацию от других существующих Broker'ов
или Gatherer'ов. Используется <tt>RunHarvest</tt>,
или может быть запущена пользователем для создания
нового брокера. Использует <em>$HARVEST_HOME</em>
и по умолчанию   <em>/usr/local/harvest</em>.
находится в каталоге <em>$HARVEST_HOME/bin</em>.
</descrip>

Не существует команды <tt>CreateGatherer</tt>,
но команда <tt>RunHarvest</tt> может создать Gatherer,
или вы можете создать Gatherer вручную (смотрите раздел
<ref id="Customizing the type recognition, candidate
selection, presentation unnesting, and summarizing steps"
name="Настройка распознавания типов, выбора кандидатов,
представление разбора и суммирование">
или раздел
<ref id="Gatherer Examples" name="Примеры Gatherer'ов">).
Расположение каталогов и программ установлнного Harvest'а
обсуждается в разделе
<ref id="Programs and layout of the installed Harvest software"
name="Программы и размещение установленного ПО Harvest">.

Среди всего прочего, команда <tt>RunHarvest</tt>
спрашивает пользователя, какие порты использовать
для Gatherer'а и Broker'а. По умолчанию Gatherer
будет использовать 8500, а Broker -- порт Gatherer'а плюс 1.
Выбор порта зависит от конкретной машины -- вам нужно выбрать порты,
которые не используются другими серверами на вашей машине.
Вы можете посмотреть в своем файле <em>/etc/services</em>,
какие порты используются (хотя в этом файле показано только несколько серверов;
некоторые сервера используют порты, нигде не регистрируя этой информации).
Обычно указанные выше порты не используются другими процессами.
По-видимому, самый простой способ -- просто попытаться использовать порты,
предлагаемые по умолчанию, и посмотреть, все ли работает.

Остальная часть этого руководства предоставляет информацию
для пользователей, которые хотят подстроить Harvest или
сделать его использование более изощренным, чем при простом
запуске <tt>RunHarvest</tt>.

<sect1>Контактная информация команды разработчиков Harvest

<p>
Если у вас есть вопросы о системе Harvest
или проблемы с ПО, оставьте сообщение новостной
группе USENET
<url url="news:comp.infosystems.harvest" name="comp.infosystems.harvest">.
Пожалуйста, укажите тип вашего компьютера, операционную систему
и версию Harvest в вашем письме.

Если у вас есть исправления ошибок, порты к новым платформам
или другие улучшения ПО, пожалуйста, отправьте email разработчику Harvest
<url url="mailto:lee@arco.de" name="lee@arco.de">.

<sect>Gatherer
<label id="The Gatherer">

<p>

<sect1>Обзор

<p>
Gatherer получает информационные ресурсы используя различные стандартные
методы доступа (FTP, Gopher, HTTP, NNTP и локальные файлы), а затем суммирует
эти ресурсы различными типизированными способами, чтобы создать структурированную индексную
информацию. Например, Gatherer может получить технический отчет с FTP
архива, а затем извлечь автора, заголовок и краткий обзор текста, чтобы
создать резюме (summarize, далее для этого понятия будет использоваться термин ``суммировать'')
технического отчета. Брокеры Harvest или другие поисковые сервисы могут
затем получать индексную информацию от Gatherer'а для использования ее поисковом индексе,
доступном через WWW интерфейс.

Gatherer состоит из большого числа отдельных компонентов. Программа
<tt>Gatherer</tt> считывает конфигурационный файл Gatherer'а и контролирует
весь процесс нумерации и резюмирования объектов данных.

Структурированная индексная информация, которую собирает Gatherer, представляется
в виде списка пар "атрибут-значение" используя <em>Форматом взаимообменов резюме объектов
(Summary Object Interchange Format -</em> SOIF, смотрите раздел
<ref id="The Summary Object Interchange Format (SOIF)"
name="The Summary Object Interchange Format (SOIF)">).
Демон <tt>gatherd</tt>
предоставляет базу данных Gatherer'а Broker"ам. Он запускается в фоновом режиме
по завершении процесса собирания. Отдельная программа <tt>gather</tt> -
это клиент для сервера <tt>gatherd</tt>. Она может использована с командной
строки для тестирования и используется Broker'ом. Gatherer использует кэш на локальном
диске для хранения полученных объектов. Дисковый кэш описывается в разделе
<ref id="The local disk cache" name="Дисковый кэш">.

Несмотря на то, что демон <tt>gatherd</tt> остается в фоновом режиме,
Gatherer не обновляет автоматически свои резюмированные объекты. Каждый
объект у Gatherer'а имеет значение Time-to-Live (``время жизни'').
Объекты остаются в базе данных
до тех пор, пока они не устареют. Смотрите в разделе
<ref id="Periodic gathering and realtime updates"
name="Периодическое собирание и обновления в реальном времени">
дополнительную информацию по хранению Gatherer'ом
обновленных объектов.

Несколько примеров Gatherer'ов поставляются вместе с дистрибутивом с ПО Harvest
(смотрите раздел
<ref id="Gatherer Examples" name="Примеры Gatherer'ов">).

<sect1>Начальная установка
<label id="Basic setup">

<p>
Чтобы запустить основной Gatherer, вам нужен только список URL'ов
(смотрите <htmlurl url="http://www.ietf.org/rfc/rfc1630.txt"
name="RFC1630"> и
<htmlurl url="http://www.ietf.org/rfc/rfc1738.txt" name="RFC1738">),
из которых он будет
собирать индексную информацию. Этот список указывается в конфигурационном файле Gatherer'а
вместе с прочей опциональной информацией, такой как имя Gatherer'а и каталог, в котором
он размещен (обратитесь в раздел
<ref id="Setting variables in the Gatherer configuration file"
name="#Задание значений переменных в конфигурационном файле Gatherer'а">
за деталями по опциональной
информации). Ниже приведен пример конфигурационного файла Gatherer'а:

<tscreen><verb>
        #
        #  sample.cf - Sample Gatherer Configuration File
        #
        Gatherer-Name:    My Sample Harvest Gatherer
        Gatherer-Port:    8500
        Top-Directory:    /usr/local/harvest/gatherers/sample

        &lt;RootNodes&gt;
        # Enter URLs for RootNodes here
        http://www.mozilla.org/
        http://www.xfree86.org/
        &lt;/RootNodes&gt;

        &lt;LeafNodes&gt;
        # Enter URLs for LeafNodes here
        http://www.arco.de/~kj/index.html
        &lt;/LeafNodes&gt;
</verb></tscreen>

Как показано в примере конфигурационного файла, можно классифицировать URL на
<bf>RootNode</bf> и <bf>LeafNode</bf>. Что касается LeafNode URL, Gatherer просто
получает URL и обрабатывает его. LeafNode URL'ы - это обычно файлы как
документы PostScript или сжатые дистрибутивы ``tar''. Gatherer разложит RootNode URL
на ноль или более LeafNode URL'ов, рекурсивно
нумеруя их способами, зависящими от метода доступа. Для FTP или Gopher Gatherer
представит листинг рекурсивных каталогов на сервере FTP или Gopher для разложения
RootNode (обычно имя каталога). Для HTTP RootNode URL разлагается
следованием ссылкам HTML на другие URL'ы. Для News нумерация
возвращает все сообщения в указанной новостной группе USENET.

ПОЖАЛУЙСТА, БУДЬТЕ ОСТОРОЖНЫ при указании RootNode, так как можно задать
гигантский объем работы одним лишь RootNode URL'ом. Чтобы предостеречь
плохо сконфигурированный Gatherer от неправильного использования серверов,
по умолчанию Gatherer разлагает RootNode на 250 LeafNode'ов, а также включает только те
HTML линки, которые указывают на документы, которые находятся на том же сервере, что и
оригинальный RootNode URL. Есть несколько опций, которые позволяют изменить эти
ограничения и иным способом улучшить спецификации Gatherer'а. За деталями обратитесь
к разделу <ref id="RootNode specifications"
name="Описание RootNode">.

Gatherer - это
<htmlurl url="http://www.robotstxt.org/wc/robots.html"
name="``robot''">,
он собирает URL'ы,
начиная с URL'ов, указанных в RootNodes. Он следует соглашению <em>robots.txt</em>
и <em>robots META tag</em>. Он также поддерживает протокол
<htmlurl url="http://www.ietf.org/rfc/rfc2616.txt" name="HTTP версии 1.1">
и отправляет
поля <em>User-Agent</em> и запросы <em>From</em> серверам HTTP для идентификации.

После того, как вы написали конфигурационный файл Gatherer'а, создайте каталог
для Gatherer'а и скопируйте туда конфигурационный файл. Затем запустите программу
<tt>Gatherer</tt> из командной строки с единственным аргументом --
именем конфигурационного файла, как показано ниже:

<tscreen><verb>
        % Gatherer GathName.cf
</verb></tscreen>

Gatherer сгенерирует базу данных, содержащую резюме документов, log-файл
(<em>log.gatherer</em>) и log-файл с ошибками (<em>log.errors</em>). Он также запустит
демон <tt>gatherd</tt>, который автоматически поставляет индексную
информацию брокерам и другим клиентам. Для просмотра экспортируемой
индексной информации вы можете использовать клиентскую программу <tt>gather</tt>, как
показано ниже:

<tscreen><verb>
        % gather localhost 8500 | more
</verb></tscreen>

Опция <bf>-info</bf> заставляет Gatherer выдавать только краткое описание документов в Gatherer'е,
которое состоит из доступных в указанной базе данных Gatherer'а атрибутов,
хоста и имени Gatherer'а, список времен обновлений объектов и числа объектов.
По умолчанию установлена компрессия, но ее можно отменить опцией
<bf>-nocompress</bf>. Опциональная метка времени говорит
Gatherer'у посылать только объекты, которые изменились со времени, указанном в метке
(в секундах с начала ``эпохи'' UNIX - 1 января 1970г).

<sect2>Сбор новостных URL'ов (News) при помощи NNTP

<p>
URL'ы News отличаются от других протоколов доступа, потому что
URL в основном не содержит имени хоста. Gatherer получает новостные URL'ы от
сервера NNTP. Имя сервера должно быть помещено в переменную окружения
<em>$NNTPSERVER</em>. Возможно, хорошая идея - добавить ее в ваш скрипт
<tt>RunGatherer</tt>. Если переменная окружения не установлена,
Gatherer попытается подсоединиться к хосту с именем <em>news</em> на вашем сайте.

<sect2>Очистка Gatherer'а

<p>
Помните, что базы данных Gatherer'а продолжают существовать между запусками.
Объекты остаются в в базе данных, пока не устареют. Эксперементируя с Gatherer'ом,
всегда является хорошей идеей ``очистка'' базы данных между запусками. Проще всего
это осуществить, выполнив команду из каталога Gatherer'а:

<tscreen><verb>
        % rm -rf data tmp log.*
</verb></tscreen>

<sect1>Описание RootNode
<label id="RootNode specifications">

<p>
Средства описания RootNode, описанные в разделе
<ref id="Basic setup" name="Начальная установка">, предоставляют
основной набор действий нумерации RootNode по умолчанию.
Обычно полезно нумеровать, не ограничиваясь пределами по умолчанию, например, чтобы
увеличить пределы нумерации (больше 250 URL'ов) или чтобы позволить пересечение границ сайтов
при нумерации линков HTML. Можно указать эти и другие аспекты нумерации следующим образом:

<tscreen><verb>
        &lt;RootNodes&gt;
        URL EnumSpec
        URL EnumSpec
        ...
        &lt;/RootNodes&gt;
</verb></tscreen>

где <em>EnumSpec</em> - одна строка
(используя ``<bf>\</bf>'' при переходе на новую строку) со следующим
синтаксисом:

<tscreen><verb>
        URL=URL-Max[,URL-Filter-filename]  \
        Host=Host-Max[,Host-Filter-filename] \
        Access=TypeList \
        Delay=Seconds \
        Depth=Number \
        Enumeration=Enumeration-Program
</verb></tscreen>

Все модификаторы <em>EnumSpec</em> опциональные и имеют следующие значения:

<descrip>
<tag/URL-Max/
Число, указываемое справа в выражении ``URL='' показывает максимальное число
URL'ов LeafNode URLs, которые нужно сгенерировать на всех уровнях глубины индексации,
начиная от текущего URL. Заметьте, что <em>URL-Max</em> - это максимальное число URL'ов
которые генерируются во время нумерации, а  <em>не</em> ограничение на то, сколько
URL'ов может пройти через фазу выбора кандидата (смотрите раздел
<ref id="Customizing the candidate selection step"
name="Настройка шага выбора кандидата">).

<tag/URL-Filter-filename/
Это имя файла, содержащего набор фильтров из регулярных выражений
(смотрите раздел <ref id="RootNode filters"
name="Фильтры RootNode">) для разрешения или
запрета отдельных LeafNode при нумерации. По умолчанию
используется фильтр <em>$HARVEST_HOME/lib/gatherer/URL-filter-default</em>, который
исключает много изображений и звуковых файлов.

<tag/Host-Max/
Число, указанное справа в выражении ``Host=''
показывает максимальное число хостов, которое может быть использовано для  нумерации RootNode.
Хосты обычно подсчитываются по своим IP-адресам, таким образом хосты, имеющие несколько алиасов
учитываются один раз. Но это не работает для хостов, имеющих несколько IP-адресов
или хостов, DNS именами которых управляет какая-нибудь программа (например,
для уравновешивания загрузки серверов).

<em>Замечание:</em> До версии Harvest 1.2 строка ``Host=...'' называлась
``Site=...''. Мы изменили имя на ``Host='', потому что оно интуитивно более понятно
(ограничение на число хостов, а не сайтов). Для совместимости с конфигурационными
файлами старых Gatherer'ов мы будем продолжать использовать
``Site='' как алиас для ``Host=''.

<tag/Host-Filter-filename/
Это имя файла, содержащего набор регулярных выражений - фильтров для
разрешения или запрещения определенных хостов в нумерации. Каждое выражение может
определять как имя хоста (или IP-адрес), так и номер порта (в случае, если у вас есть
несколько серверов на различных портах одной машины, а вы хотите проиндексировать
только один из них). Синтаксис - ``hostname:port''.

<tag/Access/
Если RootNode - это HTTP URL, тогда вы можете указать методы доступа, которыми
нужно производить нумерацию. Возможные типы методов доступа: <bf>FILE, FTP,
Gopher, HTTP, News, Telnet</bf> или <bf>WAIS</bf>. Используйте символ ``<bf>|</bf>''
между именами типов для разрешения нескольких методов доступа. Например,
``<bf>Access=HTTP|FTP|Gopher</bf>'' зайдет на URL'ы HTTP, FTP и Gopher при
нумерации HTTP URL'а RootNode.

<em>Замечание:</em> Мы не поддерживаем перекрестные методы нумерации в Gopher,
потому что трудно убедиться, что указатели Gopher не пересекают границ сайта.
Например, URL Gopher
<em>gopher://powell.cs.colorado.edu:7005/1ftp3aftp.cs.washington.edu40pub/</em>
получит листинг каталога FTP ftp.cs.washington.edu:/pub, несмотря на то, что
часть URL с именем хоста -- powell.cs.colorado.edu.

<tag/Delay/
Это число секунд ожидания между контактами с серверами. По умолчанию оно
равно одной секунде, если не указано другое. <bf>Delay=3</bf> позволит
Gatherer'у ждать 3 секунды между контактами.

<tag/Depth/
Это максимальное число уровней нумерации (глубина) во время собирания информации.
<bf>Depth=0</bf> означает, что <em>нет</em> ограничений на
глубину нумерации. <bf>Depth=1</bf> означает, что будет получен указанный URL,
а также все URL'ы, на которые есть ссылки в указанном URL'е;
и так далее для более больших значений Depth. Другими словами, Gatherer будет следовать
по ссылкам вплоть до <em>Depth</em> шагов от указанного URL'а.

<tag/Enumeration-Program/
Этот модификатор добавляет очень удобный способ контролирования Gatherer'а.
Enumeration-Program - это фильтр, который считываетs URL'ы, как входные параметры, и
записывает новые параметры нумерации на выходе. Обратитесь к разделу
<ref id="Generic Enumeration program description"
name="Описание настраиваемой программы нумерации">
за отдельными деталями.
</descrip>

По умолчанию, <em>URL-Max</em> равно 250, <em>URL-Filter</em> не делает
ограничений, <em>Host-Max</em> равно 1, <em>Host-Filter</em> не делает ограничений,
<em>Access</em> равен HTTP, <em>Delay</em> равен 1
секунде, а <em>Depth</em> равно нулю. Нет способа указать неограниченное
значение для <em>URL-Max</em> или <em>Host-Max</em>.

<sect2>Фильтры RootNode
<label id="RootNode filters">

<p>
Файлы-фильтры используют стандартный синтаксис регулярных выражений UNIX (как определено
стандартом POSIX), а не синтаксис csh. Например, нужно использовать
``.*abc'' для обозначения любой строки, заканчивающейся на ``abc'', но не ``*abc''. Файл-фильтр
имеет следующий синтаксис:

<tscreen><verb>
        Deny  regex
        Allow regex
</verb></tscreen>

Регулярные выражения в <em>URL-Filter</em> сопостовляются только с той часьтю каждого URL,
которая указывает путь (схема, имя хоста и порт не включаются). Например,
следующий файл URL-Filter позволит нумеровать все  URL'ы, кроме содержащих
регулярное выражение ``<em>/gatherers/</em>'':

<tscreen><verb>
        Deny  /gatherers/
        Allow .
</verb></tscreen>

Другое общее использование фильтров URL заключается в запрещении перехода Gatherer'а
в вышестоящий каталог. Автоматически сгенерированные страницы HTML для HTTP и FTP
каталогов часто содержат ссылку на родительский каталог ``<em>..</EM>''. Чтобы держать
Gatherer ниже указанного каталога, используйте файл фильтров URL следующим образом:

<tscreen><verb>
        Allow ^/my/cool/sutff/
        Deny  .
</verb></tscreen>

Регулярные выражения <em>Host-Filter</em> сопоставляются по части
``hostname:port'' каждого URL. Из-за включения в выражение port, вы не можете
использовать ``<bf>$</bf>'' для выделения конца имени хоста. Начиная с версии 1.3, вместо имени
хоста может быть указан IP-адрес. Адрес кдасса B, такой как 128.138.0.0 в регулярных
выражениях должен быть написан в виде ``<bf>^128\.138\..*</bf>''. Например:

<tscreen><verb>
        Deny   bcn.boulder.co.us:8080
        Deny   bvsd.k12.co.us
        Allow  ^128\.138\..*
        Deny   .
</verb></tscreen>

Важен порядок строк <bf>Allow</bf> и <bf>Deny</bf>, так как
фильтры применяются последовательно от первой строки к последней. Так, например, если вы
укажете сперва ``<bf>Allow .*</bf>'', никакие последующие выражения <bf>Deny</bf> не будут обработаны,
так как этот фильтр <bf>Allow</bf> разрешит все записи.

<sect2>Описание програмы нумерации
<label id="Generic Enumeration program description">

<p>
Гибкая нумерация может быть достигнута указанием модификатора
<bf>Enumeration=Enumeration-Program</bf> в RootNode URL.
<em>Enumeration-Program</em> - это фильтр, который принимает на стандартный вход URL и
записывает новые RootNode URL на стандартный выход.

Выходной формат отличен от указываемого RootNode URL в конфигурационном файле Gatherer'а.
Каждая выходная строка должна содержать девять полей, разделенных пробелами.
Поля следующие:

<tscreen><verb>
        URL
        URL-Max
        URL-Filter-filename
        Host-Max
        Host-Filter-filename
        Access
        Delay
        Depth
        Enumeration-Program
</verb></tscreen>

Это те же самые поля, которые описаны в разделе
<ref id="RootNode specifications" name="Описание RootNode">.
Значения должны даваться в каждом поле. Используйте <em>/dev/null</em>
для отмены имен файлов URL-Filter и Host-Filter. Испольлзуйте
<tt>/bin/false</tt> для отмены программы Enumeration.

<sect2>Пример конфигурации RootNode

<p>
Ниже приведен пример конфигурации RootNode:

<tscreen><verb>
        &lt;RootNodes&gt;
  (1)   http://harvest.cs.colorado.edu/               URL=100,MyFilter
  (2)   http://www.cs.colorado.edu/                   Host=50 Delay=60
  (3)   gopher://gopher.colorado.edu/                 Depth=1
  (4)   file://powell.cs.colorado.edu/home/hardy/     Depth=2
  (5)   ftp://ftp.cs.colorado.edu/pub/cs/techreports/ Depth=1
  (6)   http://harvest.cs.colorado.edu/~hardy/hotlist.html \
                Depth=1 Delay=60
  (7)   http://harvest.cs.colorado.edu/~hardy/ \
                Depth=2 Access=HTTP|FTP
        &lt;/RootNodes&gt;
</verb></tscreen>

Каждый из приведенных выше RootNode содержит различную конфигурации нумерации:

<enum>
<item>Этот RootNode будет собирать вплоть до 100 документов, которые пройдут через
      фильтры URL, содержащиеся в файле <em>MyFilter</em>.
<item>Этот RootNode соберет документы из первых 50 хостов, которые
      встретятся при нумерации указанного URL без ограничения на глубину
      ссылок. Он также будет ждать 60 секунд после получения каждого документа.
<item>Этот RootNode соберет документы только с верхнего уровня сервера
      Gopher на <em>gopher.colorado.edu</em>.
<item>Этот RootNode соберет все документы из каталога
      <em>/home/hardy</em> и всех подкаталогов
      <em>/home/hardy</em>.
<item>Этот RootNode соберет документы только из каталога
      <em>/pub/techreports</em>, который, в данном случае, содержит некоторые
      библиографические файлы, а не сами технические отчеты.
<item>Этот RootNode соберет все документы, которые находятся в одном шаге от
      указанного URL с интервалом в 60 секунд. Это удобный
      способ индексирования вашего ``хотлиста''. Если создать файл HTML,
      содержащий такие ``горячие'' указатели, как этот RootNode, то процесс нумерации соберет
      страницы верхнего уровня для каждого указателя.
<item>Этот RootNode соберет все документы, которые находятся не дальше, чем в двух шагах от
      указанного URL. Более того, он проследует и пронумерует любые HTTP
      и FTP ссылки, которые встретятся.
</enum>

<sect2>Нумерация Gatherer'а и выбор кандидатов
<label id="Gatherer enumeration vs. candidate selection">

<p>
Кроме использования файлов <em>URL-Filter</em> и <em>Host-Filter</em>
в механизме определения RootNode, описанного в разделе
<ref id="RootNode specifications"
name="Описание RootNode">,
вы можете предотвратить индексацию документов, настроив
файл <em>stoplist.cf</em>, описанный в разделе
<ref id="Customizing
the type recognition, candidate selection, presentation unnesting, and
summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения представлений и суммирования">.
Так как эти механизмы включаются в разное время,
они могут иметь различные эффекты. Механизмы <em>URL-Filter</em> и <em>Host-Filter</em>
вовлекаются программой Gatherer'а нумерации ``RootNode''.
Использование этих фильтров, как стоп-списков, может предотвратить скачивание нежелаемых объектов
через сеть. Это существенно может уменьшить время собирания и сетевой трафик.

Файл <em>stoplist.cf</em> используется системой извлечения содержания <em>Essence</em>
(описана в разделе
<ref id="Extracting data for
indexing: The Essence summarizing subsystem"
name="Извлечение данных для индексации: Подсистема суммирования Essence">)
<em>после</em> того,
как объекты уже получены, чтобы выбрать, из каких объектов должно быть извлечено содержание и
какие объекты должны быть проиндексированы. Это может быть полезным, так как Essence предоставляет более мощные средства
отклонения кандидатов на индексацию, при помощи которых вы можете настроить выбор объектов не только на основе имен файлов,
но и на основе их содержания (например, посмотрев на строчки в начале файла или на ``магические'' числа
UNIX). Также можно использовать более сложные схемы группирования файлов
(например, решив не извлекать содержание из файлов объектного кода, если доступен исходный код).

В качестве примера комбинирования этих механизмов, предположим, что вы хотите проиндексировать
файлы ``.ps'', имеющиеся на вашем WWW сайте. Вы можете сделать это, создав
файл <em>stoplist.cf</em>, который содержит ``HTML'' и фильтр RootNode
<em>URL-Filter</em>:

<tscreen><verb>
        Allow \.html
        Allow \.ps
        Deny  .*
</verb></tscreen>

В заключение, независимо от этих настроек, Gatherer попытается
избежать скачивание объектов, где это возможно, используя кэш на локальном диске и
заголоки HTTP запросв ``If-Modified-Since'' (если есть изменения с такого-то времени).
Кэш на локальном диске
описан в разделе
<ref id="The local disk cache"
name="Дисковый кэш">.

<sect1>Генерация LeafNode/RootNode URL'ов из программы

<p>
Можно генерировать RootNode или LeafNode URL'ы автоматически из программы.
Это может оказаться полезным, например, при собирании большого числа новостных групп Usenet.
Пргорамма указывается в разделе RootNode или
LeafNode, вместе с вертикальной чертой.

<tscreen><verb>
        &lt;LeafNodes&gt;
        |generate-news-urls.sh
        &lt;/LeafNodes&gt;
</verb></tscreen>

Скрипт должен выдавать правильные URL'ы, такие как

<tscreen><verb>
        news:comp.unix.voodoo
        news:rec.pets.birds
        http://www.nlanr.net/
        ...
</verb></tscreen>

В случае URL'ов RootNode, параметры нумерации могут быть заданы после программы.

<tscreen><verb>
        &lt;RootNodes&gt;
        |my-fave-sites.pl Depth=1 URL=5000,url-filter
        &lt;/RootNodes&gt;
</verb></tscreen>

<sect1>Извлечение данных для индексации: Подсистема суммирования Essence
<label id="Extracting data for indexing: The Essence summarizing subsystem">

<p>
После того, как Gatherer получает документ, он пропускает его через подсистему,
называемую <em>Essence</em>, чтобы извлечь информацию для индекса. Essence
позволяет Gatherer'у собирать этот индекс из большого разнообразия информации
различными способами в зависимости от типа данных и
потребностей данного индексируемого блока. В кратце, Essence может
определить тип данных, на которые указывает URL (напрмер, PostScript или HTML),
``распутать'' форматы представления (такие как сжатые файлы ``tar''),
выбрать, какой тип данных индексировать (например, не индексировать аудио файлы), и потом
применить соответствующий алгоритм (называемый <em>summarizer</em>) для
генерации резюме содержимого данных. Пользователи могут настроить каждый из этих аспектов,
но зачастую в этом нет необходимости. Harvest распространяется со стандартным набором
распозавателей типов, архиваторов (извлечение представлений), избирателей кандидатов и summarizer'ов,
которые хорошо работают для большинства приложений.

Ниже мы описываем стандартный набор summarizer'ов, компонент текущего дистрибутива, и
как пользователи могут настроить summarizer'ы и добавить свои для новых типов данных.
Если вы разрабатывате summarizer, который, вероятно, может быть полезен другим пользователям,
пожалуйста, сообщите нам по e-mail'у на
<url url="mailto:lee@arco.de" name="lee@arco.de">,
так что мы сможем включить его в наш дистрибутив Harvest'а.

<tscreen><verb>
Тип             Функция summarizer'а
--------------------------------------------------------------------
Bibliographic   Извлечение автора и заголовка
Binary          Извлечение смысловых строчек и резюме страниц руководства (manual page summary)
C, CHeader      Извлечение имен процедур, имен включенных файлов и комментариев
Dvi             Вызов summarizer'а текста на извлеченный ASCII текст
FAQ, FullText, README
                Извлечение всех слов в файле
Font            Извлечение комментариев
HTML            Извлечение выделений, гиперссылок и выбраных полей
LaTex           Разбор выбраных полей LaTex (автор, заголовок и т.д.)
Mail            Извлечение определенных полей заголовка
Makefile        Извлечение комментариев и имен целей
ManPage         Извлечение резюме, автора, заголовка и т.д. на основе макроса ``-man''
News            Извлечение определенных полей заголовка
Object          Извлечение таблицы символов
Patch           Извлечение имен ``пропаченых'' файлов
Perl            Извлечение имен процедур и комментариев
PostScript      Извлечение текста определенным обработчиком слов (word processor) и пропуск
                через summarizer текста.
RCS, SCCS       Извлечение revision control summary
RTF             Конвертирование в HTML и пропуск через HTML summarizer
SGML            Извлечение полей, названных в таблице извлечений
ShellScript     Извлечение комментариев
SourceDistribution
                Извлечение полного текста файла README и комментариев из Makefile
                и файлов исходного кода, и суммирование всех man-страниц
SymbolicLink    Извлечение имени файла, владельца и даты создания
TeX             Вызов summarizer'а текста на извлеченный ASCII текст
Text            Извлечение первых 100 строк и первых предложений всех оставшихся
                абзацев
Troff           Извлечение автора, заголовка и т.д. на основе макропакетов ``-man'', ``-ms'',
                ``-me'', или извлечение заголовков разделов и
                тем.
Unrecognized    Извлечение имени файла, владельца и даты создания.
</verb></tscreen>

<sect2>Действия стандартных summarizer'ов по умолчанию

<p>
Таблица в разделе
<ref id="Extracting data for indexing: The
Essence summarizing subsystem"
name="Извлечение данных для индексации: Подсистема суммирования Essence">
снабжает короткой
справкой о том, как документы суммируются в зависимости от их типа. Эти
действия могут быть настроены, как обсуждалось в разделе
<ref id="Customizing the type
recognition, candidate selection, presentation unnesting, and
summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">.
Некоторые summarizer'ы
реализованы как программы UNIX, в то время как
другие выражаются регулярными выражениями; обртитесь в раздел
<ref id="Customizing the
summarizing step"
name="Настройка шага суммирования">
или раздел
<ref id="Example 4"
name="Пример 4">
за информацией о том, как написать summarizer.

<sect2>Суммирование данных SGML
<label id="Summarizing SGML data">

<p>
Можно суммировать документы, которые удовлетворяют Стандартному обобщенному языку верстки
(Standart Generalized Markup Language, SGML), для которого у вас есть Определение типа документа (Document Type
Definition, DTD). HTML -- это на самом деле частное приложение SGML с соответствующим DTD.
(HTML summarizer Harvest'а может использовать HTML DTD и наш механизм суммирования SGML,
который предоставляет множество преимуществ; см. раздел
<ref id="The SGML-based HTML summarizer"
name="HTML summarizer на основе SGML">.)
SGML используется во все более увеличивающемся широком разнообразии
приложений, например как формат для хранения данных для большого числа физических наук.
Так как SGML позволяет документам иметь хорошую структуру, Harvest может суммировать документы SGML
очень эффективно.

Summarizer SGML (<tt>SGML.sum</tt>) использует программу <tt>sgmls</tt>
Джеймса Кларка (James Clark) для разбора документов SGML. Парсеру нужен и DTD документа,
и файл деклараций, который описывает допустимый набор символов.
Программа <tt>SGML.sum</tt> использует таблицу, которая сопоставляет тэги SGML с атрибутами SOIF.

<sect3>Размещение вспомогательных файлов

<p>
Вспомогательные файлы SGML можно найти в
<em>$HARVEST_HOME/lib/gatherer/sgmls-lib/</em>. Например, вот
пути по умолчанию для суммирования HTML, используя механизм суммирования SGML:

<tscreen><verb>
        $HARVEST_HOME/lib/gatherer/sgmls-lib/HTML/html.dtd
        $HARVEST_HOME/lib/gatherer/sgmls-lib/HTML/HTML.decl
        $HARVEST_HOME/lib/gatherer/sgmls-lib/HTML/HTML.sum.tbl
</verb></tscreen>

Размещение файла DTD должно быть указано в каталоге <tt>sgmls</tt>
(<em>$HARVEST_HOME/lib/gatherer/sgmls-lib/catalog</em>). Например:

<tscreen><verb>
        DOCTYPE   HTML   HTML/html.dtd
</verb></tscreen>

Программа <tt>SGML.sum</tt> ищет файл <em>.decl</em>, используя путь по умолчанию.
Другой путь может быть указан <tt>SGML.sum</tt> опцией <bf>-d</bf>.

Summarizer ищет файл <em>.sum.tbl</em> сначала в каталоге Gatherer'а
lib, а потом по пути по умолчанию. Свой путь можно указать <tt>SGML.sum</tt> опцией <bf>-t</bf>.

<sect3>Таблица соответствий SGML - SOIF

<p>
Таблица перевода снабжает простым, но мощным средством указания, как
документ SGML должен быть суммирован. Есть четыре способа сопоставить данные SGML с
SOIF. Первые два касаются помещения содержания (<em>content</em>) тэга SGML
в атрибут SOIF.

Простое сопоставление SGML и SOIF выглядит примерно так:

<tscreen><verb>
        &lt;TAG&gt;              soif1,soif2,...
</verb></tscreen>

Оно помещает все, что находится между тэгами ``TAG'' в атрибуты SOIF
``soif1'' и ``soif2''. Можно выбрать различные атрибуты SOIF
на основе значений атрибутов SGML. Например, если ``ATT'' - атрибут тэга
``TAG'', то надо написать так:

<tscreen><verb>
        &lt;TAG,ATT=x&gt;         x-stuff
        &lt;TAG,ATT=y&gt;         y-stuff
        &lt;TAG&gt;               stuff
</verb></tscreen>

Два других способа заключаются в помещении атрибутов SGML в атрибуты SOIF.
Чтобы поместить значения атрибута ``ATT'' тэга ``TAG'' в атрибут SOIF
``att-stuff'' нужно написать:

<tscreen><verb>
        &lt;TAG:ATT&gt;           att-stuff
</verb></tscreen>

Также можно поместить значение атрибута SGML в атрибут SOIF,
используя другой атрибут SOIF:

<tscreen><verb>
        &lt;TAG:ATT1&gt;          $ATT2
</verb></tscreen>

Когда summarizer встречает атрибут SGML, не занесенный в таблицу, содержимое
отнесется к родительскому тэгу и станет частью содержимого родительского тэга.
Чтобы <em>не</em> обрабатывать содержимое какого-то тэга, укажите атрибут SOIF
как ``ignore''. Чтобы содержимое некоторого тэга было рассмотрено также и в родительском тэге
в дополнение к помещению в свой атрибут SOIF, занесите в таблицу дополнительный атрибут SOIF
под названием ``parent''.

Обратитесь в раздел
<ref id="The SGML-based HTML summarizer"
name="HTML summarizer на основе SGML">
за примерами таких сопоставлений.

<sect3>Ошибки и предупреждения парсера SGML

<p>
Парсер <tt>sgmls</tt> может генерировать большой объем сообщений об ошибках
и предупреждениях. Это в особенности справедливо для документов HTML, находящихся в
Internet, которые часто не соответствуют строгому DTD HTML. По умолчанию,
ошибки и предупреждения направляются в <em>/dev/null</em> так что они не будут засорять
логи Gatherer'а. Чтобы включить эти сообщения в логи, отредактируйте
Perl скрипт <tt>SGML.sum</tt> и установите <bf>$syntax_check = 1</bf>.

<sect3>Создание summarizer'а для новых типов данных SGML

<p>
Чтобы создать summarizer SGML для новых типов данных SGML с соответствующим
DTD, вам нужно сделать следующее:

<enum>
<item>Напишите скрипт оболочки shell под именем FOO.sum, который просто содержит

      <tscreen><verb>
        #!/bin/sh
        exec SGML.sum FOO $*
      </verb></tscreen>

<item>Модифицируйте конфигурационные файлы essence (как описано в разделе
      <ref id="Customizing the type recognition step"
      name="Настройка шага распознавания типов">),
      чтобы ваш документ был понят как тип FOO.
<item>Создайте каталог
      <em>$HARVEST_HOME/lib/gatherer/sgmls-lib/FOO/</em> и скопируйте туда
      DTD и файл деклараций как FOO.dtd и FOO.decl. Отредактируйте
      <em>$HARVEST_HOME/lib/gatherer/sgmls-lib/catalog</em> и добавьте
      туда FOO.dtd.
<item>Создайте таблицу переводов FOO.sum.tbl и поместите ее вместе с DTD в
      <em>$HARVEST_HOME/lib/gatherer/sgmls-lib/FOO/</em>.
</enum>

Теперь можно протестировать все из командной строки:

<tscreen><verb>
        % FOO.sum myfile.foo
</verb></tscreen>

<sect3>HTML summarizer на основе SGML
<label id="The SGML-based HTML summarizer">

<p>
Harvest может суммировать HTML, используя свой SGML summarizer, описанный в разделе
<ref id="Summarizing SGML data"
name="Суммирование данных SGML">.
Преимущество такого подхода заключается в том, что summarizer более просто настраивается,
и удовлетворяет хорошо продуманной модели SGML (где вы можете
определить DTD для отдельных типов документов и создать интерпретирующее для
понимания DTD, а не отдельных типов документов). Минус в том, что
теперь summarizer более придирчив к синтаксису, а большинство документов Web синтаксически
не корректны. Из=за такой придирчивости, по умолчанию для HTML отключена выдача результатов проверки синтаксиса.
Если ваши документы так плохо организованы, что запутывают парсер, это может означать, что процесс
суммирования бесцеремонно умирает. Если вы обнаружите, что ваши документы HTML не суммировались
или суммировались частично, вы можете включить выдачу результатов проверки синтаксиса,
установив <bf>$syntax_check = 1</bf> в
<tt>$HARVEST_HOME/lib/gatherer/SGML.sum</tt>. Это позволит вам увидеть,
какие документы неправильные и где-именно.

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

Ниже приведена таблица SGML-SOIF, используемая по умолчанию HTML summarizer'ом:

<tscreen><verb>
Элемент HTML    Атрибуты SOIF
------------   -----------------------
    &lt;A&gt;             keywords,parent
    &lt;A:HREF&gt;        url-references
    &lt;ADDRESS&gt;       address
    &lt;B&gt;             keywords,parent
    &lt;BODY&gt;          body
    &lt;CITE&gt;          references
    &lt;CODE&gt;          ignore
    &lt;EM&gt;            keywords,parent
    &lt;H1&gt;            headings
    &lt;H2&gt;            headings
    &lt;H3&gt;            headings
    &lt;H4&gt;            headings
    &lt;H5&gt;            headings
    &lt;H6&gt;            headings
    &lt;HEAD&gt;          head
    &lt;I&gt;             keywords,parent
    &lt;IMG:SRC&gt;       images
    &lt;META:CONTENT&gt;  $NAME
    &lt;STRONG&gt;        keywords,parent
    &lt;TITLE&gt;         title
    &lt;TT&gt;            keywords,parent
    &lt;UL&gt;            keywords,parent
</verb></tscreen>

Путь к этому файлу --
<em>$HARVEST_HOME/lib/gatherer/sgmls-lib/HTML/HTML.sum.tbl</em>.

Отдельные Gatherer'ы могут производить настроенное суммирование HTML, если поместить модифицированную
версию этого файла в каталог Gatherer'а <em>lib</em>. Другой способ настройки --
модифицировать скрипт <tt>HTML.sum</tt> и добавить опцию <bf>-t</bf>
команде SGML.sum. Например:

<tscreen><verb>
        SGML.sum -t $HARVEST_HOME/lib/my-HTML.table HTML $*
</verb></tscreen>

В HTML заголовок документа записывается так:

<tscreen><verb>
        &lt;TITLE&gt;My Home Page&lt;/TITLE&gt;
</verb></tscreen>

Выше приведенная таблица переводов поместит резюме SOIF так:

<tscreen><verb>
        title{13}:  My Home Page
</verb></tscreen>

Отметим, что ``keywords,parent'' встречаются в таблице часто. Для любого
выделенного текста (жирный, курсив, гиперссылки и т.д.), слова будут
скопированы в атрибут keywords (ключевые слова) и также останутся в содержимом родительского
элемента. Так сохраняется тело читаемого текста, и определенные слова не удаляются.

Любой текст, который появляется внутри пары тэгов CODE, не будет показан в резюме,
так как мы указали ``ignore'' в качестве атрибута SOIF.

URL'ы в HTML записываются так:

<tscreen><verb>
        &lt;A HREF=&quot;http://harvest.cs.colorado.edu/&quot;&gt;
</verb></tscreen>

Указание <bf>&lt;A:HREF&gt;</bf> в таблице переводов занесет URL в атрибут SOIF как:

<tscreen><verb>
        url-references{32}: http://harvest.cs.colorado.edu/
</verb></tscreen>

<sect3>Добавление META данных в ваш HTML

<p>
Один из наиболее полезных тэгов HTML- META. Он позволяет автору документа включить
произвольные метаданные в документ HTML. Типичное применение элемента META:

<tscreen><verb>
        &lt;META NAME=&quot;author&quot; CONTENT=&quot;Joe T. Slacker&quot;&gt;
</verb></tscreen>

Указав ``<bf>&lt;META:CONTENT&gt;</bf> $NAME'' в таблице переводов, вы получите:

<tscreen><verb>
        author{15}: Joe T. Slacker
</verb></tscreen>

Используя тэги META, авторы HTML могут легко добавть список ключевых слов в свои
документы:

<tscreen><verb>
        &lt;META NAME=&quot;keywords&quot; CONTENT=&quot;word1 word2&quot;&gt;
        &lt;META NAME=&quot;keywords&quot; CONTENT=&quot;word3 word4&quot;&gt;
</verb></tscreen>

<sect3>Другие примеры

<p>
Очень короткий summarizer HTML может быть создан таблицей, которая только помещает
выделенные слова в атрибут ключевых слов keywords:

<tscreen><verb>
Элемент HTML   Атрибуты SOIF
------------   -----------------------
    &lt;A&gt;             keywords
    &lt;B&gt;             keywords
    &lt;EM&gt;            keywords
    &lt;H1&gt;            keywords
    &lt;H2&gt;            keywords
    &lt;H3&gt;            keywords
    &lt;I&gt;             keywords
    &lt;META:CONTENT&gt;  $NAME
    &lt;STRONG&gt;        keywords
    &lt;TITLE&gt;         title,keywords
    &lt;TT&gt;            keywords
</verb></tscreen>

Наоборот, полнотекстовый summarizer можно легко сделать так:

<tscreen><verb>
Элемент HTML   Атрибуты SOIF
------------   -----------------------
    &lt;HTML&gt;          full-text
    &lt;TITLE&gt;         title,parent
</verb></tscreen>

<sect2>Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования
<label id="Customizing the type recognition, candidate selection, presentation unnesting, and summarizing steps">

<p>
Действия Gatherer'а определяются набором конфигурационных файлов, утилит и
соответствующим набором исполняемых программ, на которые ссылаются конфигурационные файлы.

Если вы хотите настроить Gatherer, вам нужно создать подкаталоги <em>bin</em> и
<em>lib</em> в каталоге, где вы запускаете Gatherer, а потом
скопировать <em>$HARVEST_HOME/lib/gatherer/*.cf</em> и
<em>$HARVEST_HOME/lib/gatherer/magic</em> в ваш каталог <em>lib</em>. Потом добавьте
в конфигурационный файл вашего Gatherer'а:

<tscreen><verb>
        Lib-Directory:         lib
</verb></tscreen>

Ниже описаны детали о том, что делает каждый из этих файлов. Основное
содержание типичного каталога Gatherer'а следующее (отметим: некоторые
имена файлов ниже можно изменить, установив переменные в конфигурационнм файле Gatherer'а,
как описано в разделе
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">):

<tscreen><verb>
        RunGatherd*    bin/           GathName.cf    log.errors     tmp/
        RunGatherer*   data/          lib/           log.gatherer

        bin:
        MyNewType.sum*

        data:
        All-Templates.gz    INFO.soif    PRODUCTION.gdbm    gatherd.log
        INDEX.gdbm          MD5.gdbm     gatherd.cf

        lib:
        bycontent.cf   byurl.cf       quick-sum.cf
        byname.cf      magic          stoplist.cf

        tmp:
</verb></tscreen>

<tt>RunGatherd</tt> и <tt>RunGatherer</tt> используются, чтобы экспортировать
базу данных Gatherer'а после перезапучка машины и запуска Gatherer'а,соответственно.
Файлы <em>log.errors</em> и <em>log.gatherer</em> содержат
сообщения об ошибках и вывод программы <em>Essence</em>, соответственно
(Essence будет коротко описан). Файл <em>GathName.cf</em> - это конфигурационный файл
Gatherer'а.

Каталог <em>bin</em> содержит все summarizer'ы и другие программы, которые
нужны summarizer'ам. Если бы вам нужно было настроить Gatherer, добавив
summarizer, вам нужно было бы поместить соответствующие программы в этот каталог <em>bin</em>;
<tt>MyNewType.sum</tt> - пример.

Каталог <em>data</em> содержит базу данных Gatherer'а, которую
экспортирует <tt>gatherd</tt>. База данных Gatherer'а состоит из файлов
<em>All-Templates.gz, INDEX.gdbm, INFO.soif, MD5.gdbm</em> и
<em>PRODUCTION.gdbm</em>. Файл <em>gatherd.cf</em> используется для поддержки
контроля доступа, что описано в разделе
<ref id="Controlling
access to the Gatherer's database"
name="Контроль доступа к базе данных Gatherer'а">.
В файл <em>gatherd.log</em>
программа <tt>gatherd</tt> заносит свою информацию (логи).

Каталог <em>lib</em> содержит конфигурационные файлы, используемы подсистемами
Gatherer'а, а именно Essence. Эти файлы коротко описаны в следующей таблице:

<tscreen><verb>
        bycontent.cf    Эвристика разбора содержания для распознавания типов
        byname.cf       содержит эвристики для распознавания типов по именам файлов
        byurl.cf        содержит эвристики для распознавания типов по URL
        magic           инструкции команды ``file'' UNIX (соотвествующие строкам
                        bycontent.cf)
        quick-sum.cf    Извлекает атрибуты на шаге суммирования
        stoplist.cf     содержит типы файлов, которые нужно отклонить на шаге выбора кандидатов
</verb></tscreen>

<sect3>Настройка шага распознавания типов
<label id="Customizing the type recognition step">

<p>
Essence распознает типы тремя способами (в порядке приоритета): по названиям URL,
по названиям файлов и определяя
<em>иденцифицирующие</em> данные в файле, используя команду (<tt>file</tt>)
UNIX.

Чтобы изменить шаг распознавания типов, отредактируйте <em>lib/byname.cf</em> для добавления
эвристики по имени файла, или <em>lib/byurl.cf</em> для добавления эвристики по URL, или
<em>lib/bycontent.cf</em> для добавления эвристики по содержимому. Эвристика по содержимому
согласовывается с выходом комманды <tt>file</tt>, так что возможно также понадобится
отредактировать файл <em>lib/magic</em>. Обратитесь в разделы
<ref id="Example 3" name="Пример 3"> и  <ref id="Example 4"
name="Пример 4"> за подробными примерами, как настроить шаг распознавания типов.

<sect3>Настройка шага выбора кандидатов
<label id="Customizing the candidate selection step">

<p>
Конфигурационный файл <em>lib/stoplist.cf</em> содержит список типов, которые
отклоняются Essence. Вы можете добавить или удалить некоторые типы из
<em>lib/stoplist.cf</em> для контроля шага выбора кандидатов.

Чтобы направить Essence индексировать только определенные типы, вы можете составить список типов для
индексирования в <em>lib/allowlist.cf</em>. Потом укажите Essence флаг
<bf>--allowlist</bf>.

Эвристики по именам файлов и URL, используемые на шаге распознавания типов
(описано в разделе
<ref id="Customizing the type recognition step"
name="Настройка шага распознавания типов">),
в особенности полезны для выбора кандидаьов при
собирании удаленных данных. Они позволяют Gatherer'у избежать получение файлов,
которые вы не хотите индексировать (в отличие от этого распознавание типов определением
иденцифицирующих данных внутри фалйа требует сначала получение файла). Такой подход
может сохранить достаточно много сетевого трафика, особенно при индексировании
<em>RootNode</em> URL'ов. Например, много сайтов
предлагают свои файлы как в сжатом, так и не в сжатом виде. Создав
<em>lib/allowlist.cf</em>, содержащий только сжатые типы, вы сможете избежать
получение несжатых версий файлов.

<sect3>Настройка шага извлечения представлений
<label id="Customizing the presentation unnesting step">

<p>
Некоторые типы объявлены как ``уплотненные'' (nested). Essence трактует их не так, как
другие типы, он запускает алгоритм извлечения представлений или ``Exploder''
лдя этих данных, а не Summarizer. На данный момент Essence может работать с файлами, сжатыми
в следующих форматах:

<enum>
<item>binhex
<item>uuencode
<item>shell archive (``shar'')
<item>tape archive (``tar'')
<item>bzip2 compressed (``bzip2'')
<item>compressed
<item>GNU compressed (``gzip'')
<item>zip compressed archive
</enum>

Чтобы настроить щаг извлечения представлений, вы можете модифицировать
исходный файл Essence <em>src/gatherer/essence/unnest.c</em>. Этот файл выдает список
доступных кодировок представления, а также указывает алгоритм расжатия.
Обычно используется внешняя программа для раскрывания файла в один или более
файлов-компонент (например <tt>bzip2, gunzip, uudecode,</tt> и
<tt>tar</tt>).

<em>Exploder</em> также можно использовать для преобразования файла в поток объектов SOIF.
Программа Exploder принимает URL как первый аргумент в командной строке и
файл, содержащий данные, как второй аргумент, а потом генерирует один или более
объектов SOIF на выходе. Для вашего удобства, тип <em>Exploder</em> уже
определен как уплотненный тип (nested type). Для сохранения некоторго времени вы можете
использовать этот тип и соответствующую программу <tt>Exploder.unnest</tt>, а не
модифицировать код Essence.

Обратитесь в раздел
<ref id="Example 2" name="Пример 2">
за подробным примером по написанию Exploder'а. Файл <em>unnest.c</em>
также содержит информацию по определению алгоритмов расжатия.

<sect3>Настройка шага суммирования
<label id="Customizing the summarizing step">

<p>
Essence поддерживает два механизма для определения алгоритмов извлечения по типу
(называемые <em>Summarizer'ами</em>), которые генерируют резюме содержимого (summaries): программа UNIX,
которая принимает имя файла для суммированя в качестве одного аргумента в командной строке, и
регулярные выражения, указанные в
<em>lib/quick-sum.cf</em>. Обратитесь в раздел
<ref id="Example 4"
name="Пример 4">
за подробными примерами, как определять оба типа Summarizer'ов.

Summarizer'ы UNIX принято называть <tt>TypeName.sum</tt>
(например, <tt>PostScript.sum</tt>). Эти Summarizer'ы выдают на выходе резюме содержимого
в виде списка атрибут SOIF - значение (см. раздел
<ref id="The Summary Object Interchange Format (SOIF)"
name="Формат взаимообмена краткими изложениями документов (SOIF)">).
Вы можете использовать
команду <tt>wrapit</tt> для облечения сырой выход в формат SOIF (т.е., для
расстановки разграничителей на отдельные пары атрибут-значение).

Есть summarizer, называемый <tt>FullText.sum</tt>, который вы можете использовать для
представления полнотекстового индексирования выбранного типа файлов просто заставив конфигурационные файлы
<em>lib/bycontent.cf</em> и <em>lib/byname.cf</em> распознавать желаемые типы файлов как
FullText (т.е., напишите ``FullText'' напротив соответствующего регулярного выражения).

<sect1>Пост-суммирование: настройка резюме объектов (object summaries) по правилам

<p>
Возможна ``тонкая настройка'' резюме, сгенерированных summarizer'ами Essence.
Типичным приложением этого может быть изменение атрибута
<em>Time-to-Live</em> (время жизни), основанного на некоторых сведениях о объекте. Так,
администратор может использовать свойства пост-суммирования и дать быстро меняющимся
объектам малый TTL, а очень стабильным документам - большой TTL.

Объекты выбираются для пост-суммирования, если они удовлетворяют указанным условиям.
Условие состоит из трех частей: имя атрибута, оператор, и некоторая строка данных. Например:
some string data.  For example:

<tscreen><verb>
        city == 'New York'
</verb></tscreen>

В этом случае мы проверяем, равен ли атрибут <em>city</em>
строке ``New York''. Для точного совпадения строк, строка должна быть заключена
в одинарные кавычки. Также поддерживаются регулярные выражения:

<tscreen><verb>
        city ~ /New York/
</verb></tscreen>

Также поддерживаются отрицательные операторы:

<tscreen><verb>
        city != 'New York'
        city !~ /New York/
</verb></tscreen>

Условия могут быть объединены операторами `<bf>&amp;&amp;</bf>' (логическое ``И'') или
`<bf>||</bf>' (логическое ``ИЛИ''):

<tscreen><verb>
        city == 'New York' &amp;&amp; state != 'NY';
</verb></tscreen>

Если объект удовлетворяет всем условиям, над ним выполняется несколько инструкций.
Можно указать четыре типа инструкций:

<enum>
<item>Установить атрибуту точно заданное значение. Например:

      <tscreen><verb>
        time-to-live = &quot;86400&quot;
      </verb></tscreen>

<item>Отфильтровать атрибут какой-нибудь программой. Значение атрибута подается на
      вход фильтра. Фильтр выдает новое значение атрибута.
      Например:

      <tscreen><verb>
        keywords | tr A-Z a-z
      </verb></tscreen>

<item>Отфильтровать множественные атрибуты программой. В этом случае фильтр
      должен прочитать и записать атрибуты в формате SOIF. Например:

      <tscreen><verb>
        address,city,state,zip ! cleanup-address.pl
      </verb></tscreen>

<item>Особый случай инструкций - удалить объект. Чтобы сделать это, напишите
      просто:

      <tscreen><verb>
        delete()
      </verb></tscreen>

</enum>

<sect2>Файл правил

<p>
Условия и инструкции объединены вместе в файле правил (``rules'' file).
Формат этого файла чем-то напоминает формат файла Makefile; условия начинаются в
первой колонке, а инструкции отделяются табуляцией.

Например:

<tscreen><verb>
        type == 'HTML'
                partial-text | cleanup-html-text.pl

        URL ~ /users/
                time-to-live = &quot;86400&quot;
                partial-text ! extract-owner.sh

        type == 'SOIFStream'
                delete()
</verb></tscreen>

Файл правил указывается в файле gatherer.cf при помощи тэга
Post-Summarizing, например:

<tscreen><verb>
        Post-Summarizing: lib/myrules
</verb></tscreen>

<sect2>Rewriting URLs

<p>
До версии 1.4 невозможно было переписать часть резюме, содержащую URL.
Сейчас это возможно, но только при помощи инструкции ``pipe''. Это
может оказаться полезным для людей, желающих запустить Gatherer для URL'ов типа <em>file://</em>, но
которые должны показываться как <em>http://</em>. Сделать это можно с таким правилом
пост-суммирования как:

<tscreen><verb>
        url ~ 'file://localhost/web/htdocs/'
                url | fix-url.pl
</verb></tscreen>

А скрипт `fix-url.pl' может выглядеть так:

<tscreen><verb>
        #!/usr/local/bin/perl -p
        s'file://localhost/web/htdocs/'http://www.my.domain/';
</verb></tscreen>

<sect1>Администрирование Gatherer'а

<p>

<sect2>Задание значений переменных в конфигурационном файле Gatherer'а
<label id="Setting variables in the Gatherer configuration file">

<p>
Кроме настроек, описанных в разделе
<ref id="Customizing the type recognition, candidate selection,
presentation unnesting, and summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">,
вы можете настроить Gatherer, установив переменные в
конфигурационном файле Gatherer'а. Этот файл состоит из двух частей: список
переменных, которые указывают информацию о Gatherer'е (такую как его имя, хост,
и номер порта), и два списка URL (разделенных на <bf>RootNodes</bf> и
<bf>LeafNodes</bf>), из которых нужно собирать индексируемую информацию. Раздел
<ref id="Basic setup"
name="Начальная установка">
содержит пример конфигурационного файла Gatherer'а. В этом разделе мы
сосредоточим внимание на переменных, которые может установить пользователь в первой части
конфигурационного файла Gatherer'а.

Название каждой переменной начинается в первой колонке, заканчивается двоеточием, потом следует
значение. Следующая таблица показывает поддерживаемые переменные:

<tscreen><verb>
        Access-Delay:           Задержка по умолчанию между доступами к URL.
        Data-Directory:         Каталог, куда записывается база данных GDBM.
        Debug-Options:          Опции отладчтка, передаваемые дочерним программам.
        Errorlog-File:          Файл для записи ошибок.
        Essence-Options:        Любые дополнительные опции для программы Essence.
        FTP-Auth:               Имя пользователя/пароль для защищенных документов FTP.
        Gatherd-Inetd:          Обознчает, что gatherd запущен из inetd.
        Gatherer-Host:          Полное имя хоста, на котором запущен Gatherer.
        Gatherer-Name:          Униакльное имя Gatherer'а.
        Gatherer-Options:       Дополнительные опции для Gatherer'а.
        Gatherer-Port:          Номер порта для демона gatherd.
        Gatherer-Version:       Версия Gatherer'а.
        HTTP-Basic-Auth:        Имя пользователя/пароль для защищенных документов HTTP.
        HTTP-Proxy:             хост:порт вашего HTTP прокси.
        Keep-Cache:             ``yes'', чтобы не удалять кэш на локальном диске.
        Lib-Directory:          Каталог, в котором "живут" конфигурационные файлы.
        Local-Mapping:          Преобразование информации для локального собирания.
        Log-File:               Файл для записи логов.
        Post-Summarizing:       Файл правил для пост-суммирования.
        Refresh-Rate:           Скорость обновления объектов в секундах, по умолчанию 1 неделя.
        Time-To-Live:           Время жизни объектов в секундах, по умолчанию 1 месяц.
        Top-Directory:          Каталог верхнего уровня для Gatherer'а.
        Working-Directory:      Каталог для временных файлов (tmp) и локального кэша.
</verb></tscreen>

Замечания:

<itemize>
<item>Мы рекомендуем вам использовать переменную <bf>Top-Directory</bf>, так как она установит
      переменные <bf>Data-Directory</bf>, <bf>Lib-Directory</bf> и
      <bf>Working-Directory</bf>.
<item>И <bf>Working-Directory</bf>, и <bf>Data-Directory</bf> будут иметь файлы
      после запуска Gatherer'а. <bf>Working-Directory</bf> будет хранить
      локальный кэш, который использует Gatherer для уменьшения сетевого трафика, а
      <bf>Data-Directory</bf> будет хранить базы данных GDBM, которые хранят содержимое
      резюме.
<item>Следует использовать полные, а не относительные имена каталогов.
<item>Все определения переменных <em>должны</em> быть сделаны перед URL'ами RootNode и
      LeafNode.
<item>Любая строка, начинающаяся с ``#'' - комментарий.
<item><bf>Local-Mapping</bf> обсуждается в разделе
      <ref id="Local file system gathering for reduced CPU load"
      name="Собирание на локальной файловой системе для сниженной загрузки процессора">.
<item><bf>HTTP-Proxy</bf> будет получать URL'ы HTTP через прокси сервер. Синтаксис следующий:
      <bf>hostname:port</bf>; например, <bf>proxy.yoursite.com:3128</bf>.
<item>Опция <bf>Essence-Options</bf> особенно полезна, так как позволяет легко настроить
      основные аспекты Gatherer'а.
<item>Единственная действительная опция <bf>Gatherer-Options</bf> -- <bf>--save-space</bf>, которая
      указывает Gatherer'у быть более эффективным с местом на диске при подготовке своей базы данных
      для экспорта.
<item>Программа <tt>Gatherer</tt> примет флаг <bf>-background</bf>, который
      заставит Gatherer запуститься в фоновом режиме.
</itemize>

Опции Essence:

<tscreen><verb>
Опция                   Значение
--------------------------------------------------------------------
--allowlist filename    Файл со списком допустимых типов
--fake-md5s             Генерирует MD5 для объектов SOIF из программы .unnest
--fast-summarizing      Увеличивает скорость за счет согласованности данных. Используйте только,
                        когда уверены, что внешний summarizer будет генерировать чистые,
                        уникальные атрибуты.
--full-text             Использует весь файл вместо резюме. Также вы
                        можете получить полный текст, индексируя отдельные типы
                        файлов, используя summarizer FullText.sum.
--max-deletions n       Число удалений GDBM перед реорганизацией
--minimal-bookkeeping   Генерирует минимальное число атрибутов учета системных ресурсов
--no-access             Не читать содержимое объектов
--no-keywords           Не генерировать ключевые слова автоматически
--stoplist filename     Файл со списком типов, которые подлежат удалению
--type-only             Только типы данных; не суммировать объекты
</verb></tscreen>

Особенное замечание о полнотекстовом суммировании: Использование опции Essence
<bf>--full-text</bf> запрещает файлам проходить через механизм извлечения содержания Essence.
Вместо этого, все содержимое файлов включается в поток резюме SOIF.
В некоторых случаях это может привести к нежелательным результатам (например, программа
сразу включит PostScript, а не пропустит сначала его через переводчик данных
из PostScript в текст, предоставляя несколько терминов, поддающихся поиску,
и большие объекты SOIF). Использование механизма суммирования отдельных типов файлов,
описанное в разделе
<ref id="Customizing the summarizing step"
name="Настройка шага суммирования">,
будет лучше работать в этом случае, но потребует от вас
указать, как должны извлекаться данные для каждого отдельного типа файлов. В следующих
версиях Harvest мы заменим опцию Essence <bf>--full-text</bf>, чтобы
выполнять извлечение содержимого перед включением полного текста документов.

<sect2>Собирание на локальной файловой системе для сниженной загрузки процессора
<label id="Local file system gathering for reduced CPU load">

<p>
Хотя рабочая нагрузка Gatherer'а определяется указываемыми URL'ами, часто собираемые файлы
размещены в локальной файловой системе. В этом случае гораздо более
эффективно собирать прямо с файловой системы, а не через
FTP/Gopher/HTTP/News, в основном потому, что все требуемые порождаемые процессы UNIX должны
собирать информацию через сетевые процессы. Например, наши измерения
показывают, что процессор нагружен в 4-7 раз больше при собирании с FTP, чем прямо с
локальной файловой системы. Для больших коллекций (например, архивные сайты, содержащие
тысячи файлов), выигрыш процессорного времени может быть значительным.

Начиная с версии 1.1 Harvest'а стало возможным указать Gatherer'у, как
транслировать URL'ы в имена локальной файловой системы, используя переменную <bf>Local-Mapping</bf>
конфигурационного файла Gatherer'а (см. раздел
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">.
Синтаксис:

<tscreen><verb>
        Local-Mapping: URL_prefix local_path_prefix
</verb></tscreen>

Это заставит во время сбора транслироваться все URL'ы, начинающиеся с <bf>URL_prefix</bf>, в
файлы, начинающиеся с <bf>local_path_prefix</bf>, но
в результатах запросов будут оставаться URL'ы (поэтому объекты могут быть получены как
обычно). Заметьте, что регулярные выражения здесь не поддерживаются. Например,
указание

<tscreen><verb>
        Local-Mapping: http://harvest.cs.colorado.edu/~hardy/ /homes/hardy/public_html/
        Local-Mapping: ftp://ftp.cs.colorado.edu/pub/cs/ /cs/ftp/
</verb></tscreen>

заставит URL <em>http://harvest.cs.colorado.edu/~hardy/Home.html</em>
транслироваться в локальное файловое имя
<em>/homes/hardy/public_html/Home.html</em>, а URL
<em>ftp://ftp.cs.colorado.edu/pub/cs/techreports/schwartz/Harvest.Conf.ps.Z</em>
будет транслирован в имя
<em>/cs/ftp/techreports/schwartz/Harvest.Conf.ps.Z</em>.

Локальное собирание будет работать с фаловой системой NFS. Локальное транслирование не удастся,
если: локальные файлы не могут быть открыты для чтения; локальный файл - не регулярный файл
(например, ссылка); у локального файла установлены биты на исполнение. Так, к каталогам,
символическим ссылкам и сценариям CGI всегда обращается сервер, а не локальная
файловая система. Наконец, Gatherer не предоставляет никаких преобразований синтаксиса URL
для локального транслирования. Если ваш URL содержит управляющие символы
(см. <htmlurl url="http://www.ietf.org/rfc/rfc1738.txt" name="RFC1738">), тогда локальное
преобразование не удастся. Начиная с версии 1.4 (patchlevel 2) Essence
печатает <em>[L]</em> после каждого URL, который был удачно обработан локально.

Заметье, что если ваша сеть сильно загружена, на самом деле может оказаться быстрее
собрать через HTTP/FTP/Gopher, чем по NFS, так как NFS становится очень неэффективным в
сильно нагруженных сетях. Гораздо лучше запускать свои Gatherer'ы на хостах на
их собственных дисках и обращаться к ним прямо через локальную файловую систему.

<sect2>Собирание с серверов, защищенных паролем

<p>
Вы можете собирать документы, защищенные паролем, с серверов HTTP и FTP. В
обоих случаях, вы можете указать имя пользователя и пароль как часть URL. Формат
следующий:

<tscreen><verb>
         ftp://user:password@host:port/url-path
        http://user:password@host:port/url-path
</verb></tscreen>

В таком формате, часть ``user:password'' хранится как часть строки URL
во всем процессе обработки Harvest'ом. Это может позволить любому,
кто имеет доступ у
вашему брокеру, получить доступ к документам, защищенным паролем.

Вы можете хранить информацию с именем пользователя и паролем в ``спрятанном'' виде, указав
индецифицирующую информацию в конфигурационном файле Gatherer'а. Для HTTP
формат следующий:

<tscreen><verb>
        HTTP-Basic-Auth: realm username password
</verb></tscreen>

где <bf>realm</bf> - это то же самое, что и параметр <bf>AuthName</bf> в конфигурационном файле
Apache httpd <em>httpd.conf</em> или файле <em>.htaccess</em>. В других конфигурациях сервера httpd
значание realm иногда называется <bf>ServerId</bf>.

Для FTP формат в файле gatherer.cf следующий:

<tscreen><verb>
        FTP-Auth: hostname[:port] username password
</verb></tscreen>

<sect2>Контроль доступа к базе данных Gatherer'а
<label id="Controlling access to the Gatherer's database">

<p>
Вы можете использовать файл <em>gatherd.cf</em> (помещенный в каталог
Gatherer'а <bf>Data-Directory</bf>) для контроля доступа к базе данных Gatherer'а.
В строке, начинающейся с <bf>Allow</bf>, соодержится произвольное число имен доменов или хостов,
которым разрешено подключаться к Gatherer'у. Если используется слово <bf>all</bf>, тогда
подходят все хосты. <bf>Deny</bf> имеет противоположное назначение к <bf>Allow</bf>. Следующий пример
разрешит доступ к базе данных Gatherer'а только хостам из доменов <bf>cs.colorado.edu</bf> или <bf>usc.edu</bf>:

<tscreen><verb>
        Allow  cs.colorado.edu usc.edu
        Deny   all
</verb></tscreen>

<sect2>Периодическое собирание и обновления в реальном времени
<label id="Periodic gathering and realtime updates">

<p>
Программа <tt>Gatherer</tt> автоматически не совершает никаких периодических
обновлений -- когда вы запустите ее, она обработает указанные URL'ы, запустит
демон <tt>gatherd</tt> (если он уже не запущен), и затем прекратит работу. Если
вы хотите периодически обновлять данные (например, чтобы получать новые файлы, как только они
появлятся в FTP архиве), вам нужно использовать команду UNIX <tt>cron</tt> для
запуска программы <tt>Gatherer</tt> с каким-то регулярным интервалом.

Чтобы установить периодическое собирание при помощи <tt>cron</tt>, используйте
команду <tt>RunGatherer</tt>, которую создаст <tt>RunHarvest</tt>.
Пример скрипта <tt>RunGatherer</tt>:

<tscreen><verb>
        #!/bin/sh
        #
        #  RunGatherer - Runs the ATT 800 Gatherer (from cron)
        #
        HARVEST_HOME=/usr/local/harvest; export HARVEST_HOME
        PATH=${HARVEST_HOME}/bin:${HARVEST_HOME}/lib/gatherer:${HARVEST_HOME}/lib:$PATH
        export PATH
        NNTPSERVER=localhost; export NNTPSERVER
        cd /usr/local/harvest/gatherers/att800
        exec Gatherer "att800.cf"
</verb></tscreen>

Вам следует запускать оманду <tt>RunGatherd</tt> из системного файла начальной загрузки
(например, <em>/etc/rc.local</em>), чтобы база данных Gatherer'а экспортировалась всякий
раз, когда машина перегружается. Пример скрипта <tt>RunGatherd</tt>:

<tscreen><verb>
        #!/bin/sh
        #
        #  RunGatherd - starts up the gatherd process (from /etc/rc.local)
        #
        HARVEST_HOME=/usr/local/harvest; export HARVEST_HOME
        PATH=${HARVEST_HOME}/lib/gatherer:${HARVEST_HOME}/bin:$PATH; export PATH
        exec gatherd -d /usr/local/harvest/gatherers/att800/data 8500
</verb></tscreen>

<sect2>Дисковый кэш
<label id="The local disk cache">

<p>
Gatherer содержит локальный дисковый кэш файлов, которые он собирает, чтобы снизить
сетевой трафик после перезапуска неудачных попыток сбора. Однако, так как
к уаленному серверу должен быть доступ независимо от того, запущен ли <tt>Gatherer</tt>,
не устанвливайте работу cron на слишком частый запуск <tt>Gatherer'а</tt>.
Типичное значение может быть неделя или месяц, в зависимости от того, как загружена сеть
и как важно вам иметь более свежие данные.

По умолчанию, локальный кэш Gatherer'а удаляется после каждого удачного завершения.
Чтобы сохранить кэш между сессиями Gatherer'а, определите переменную
<bf>Keep-Cache: yes</bf> в конфигурационном файле Gatherer'а (раздел
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">).

Если вы хотите, чтобы индекс вашего брокера отображал новые данные, тогода вы должны запустить
Gatherer <em>и</em> запустить коллекционирование брокера. По умолчанию брокер будет осуществлять
коллекционирования раз в день. Если вы хотите, чтобы брокер коллекционировал данные, как только
они будут собраны, тогда вам нужно координировать синхронизацию завершения собираний
Gatherer'а и брокера.

Если вы запускаете ваш Gatherer часто и используете <bf>Keep-Cache: yes</bf> в
конфигурационном файле Gatherer'а, тогда локальный кэш Gatherer'а может
перемешиваться с получаемыми обновлениями. По умолчанию объекты в локальном кэше
устаревают через 7 дней; однако, вы можте заставить ``устаревать'' их быстрее, установив
переменную окружения <bf>$GATHERER_CACHE_TTL</bf>, равную числу секунд для времени жизни
(Time-To-Live, TTL) перед запуском Gatherer'а, или вы можете изменить
<tt>RunGatherer</tt>, чтобы удалять каталог Gatherer'а <em>tmp</em> после
каждого запуска Gatherer'а. Например, чтобы объекты устаревали в локальном кэше через
один день:

<tscreen><verb>
        % setenv GATHERER_CACHE_TTL 86400       # one day
        % ./RunGatherer
</verb></tscreen>

Размер локального кэша Gatherer'а равен по умолчанию 32 MB, но вы можете изменить
это значение, установив переменную окружения <bf>$HARVEST_MAX_LOCAL_CACHE</bf>
равную числу MB перед запуском Gatherer'а. Например, для максимального размера кэша
10 MB вы можете проделать следующее:

<tscreen><verb>
        % setenv HARVEST_MAX_LOCAL_CACHE 10       # 10 MB
        % ./RunGatherer
</verb></tscreen>

Если у вас есть доступ к программному обеспечению, которое создает файлы, которые
вы индексируете (например, если все обновления пропускаются через особенный редактор, скрипты
обновления, или системные вызовы), вы можте модифицировать ПО, чтобы заставить
Gatherer делать обновления в реальном времени сразу после создания или обновления файла. Например, если все
пользователи обнавляют индексируемы файлы, используя определенную программу, эта программа
может быть модифицирована для запуска Gatherer'а по окончании пользовательских обновлений.

Заметьте, что при использовании вместе с <tt>cron</tt>, Gatherer
предоставляет мощную возможность ``зеркалирования'' данных (data ``mirroring''). Вы можете использовать Gatherer для
дублирования содержимого одного или нескольких сайтов, получения данных в различных форматах по
различным протоколам (FTP, HTTP, etc.), по желанию проделывать разнообразие преобразований данных
в зависимости от их типа или сайта, и эффективно выдавать результаты
в виде сжатых резюме объектов SOIF другим сайтам, которые хотят
использовать данные для построения индексов или других целей.

<sect2>Включение в Gatherer информации, сгенерированной вручную
<label id="Incorporating manually generated information into a Gatherer">

<p>
Возможно вы захотите проверить качество автоматически сгенерированных шаблонов SOIF.
В общем случае, техника Essence для автоматического извлечения информации
производит неидельные результаты. Иногда возможно настроить summarizer'ы,
чтобы они лучше подходили данному контексту (см. раздел
<ref id="Customizing the summarizing step"
name="Настройка шага суммирования">).
Иногда, однако, может иметь смысл пополнить или
изменить автоматически сгенерированные ключевые слова, вручную вводя информацию.
Например, вы можете захотеть добавить атрибуты <em>Title</em> в содержимое
резюме для набора документов PostScript (так как довольно трудно получить их
автоматически из PostScript).

Harvest имеет некоторые программы, которые автоматически вычищают базу данных Gatherer'а.
Программа <tt>rmbinary</tt> удаляет любые двоичные данные из шаблонов объектов.
Программа <tt>cleandb</tt> делает простое утверждение объектов SOIF,
и если задан флаг <bf>-truncate</bf>, она обрежет
поле данных <em>Keywords</em> до 8 килобайт. Чтобы помочь вручную управлять
базами данных Gatherer'а, имеется средство управления базами данных GDBM <tt>gdbmutil</tt>
в <em>$HARVEST_HOME/lib/gatherer</em>.

В будущих выпусках Harvest'а мы добавим механизм на основе форм, чтобы
легко вручную вносить дополнения. А пока вы можете дополнять
базу данных Gatherer'а информацией, написанной вручную, используя программы
<tt>mktemplate</tt>, <tt>template2db</tt>, <tt>mergedb</tt> и
<tt>mkindex</tt>. Сначала вам нужно создать файл (назовем его, скажем,
<em>annotations</em>) в слеующем формате:

<tscreen><verb>
        @FILE { url1
        Attribute-Name-1:        DATA
        Attribute-Name-2:        DATA
        ...
        Attribute-Name-n:        DATA
        }

        @FILE { url2
        Attribute-Name-1:        DATA
        Attribute-Name-2:        DATA
        ...
        Attribute-Name-n:        DATA
        }

        ...
</verb></tscreen>

Заметьте, что <em>атрибуты</em> должны начинаться в нулевой колонке и должна быть одна табуляция
после колонки, а данные (<em>DATA</em>) должны быть в пределах одной строчки.

Затем, запустите программы <tt>mktemplate</tt> и <tt>template2db</tt>,
чтобы сгенерировать SOIF и потом версии GDBM этих данных (у вас может быть несколько
файлов с дополнениями, и вы можете сгенерировать одну базу данных GDBM при помощи вышеуказанных команд):

<tscreen><verb>
        % set path = ($HARVEST_HOME/lib/gatherer $path)
        % mktemplate annotations [annotations2 ...] | template2db annotations.gdbm
</verb></tscreen>

Наконец, запустите <tt>mergedb</tt>, чтобы включить дополнения в
автоматически сгенерированные данные, и <tt>mkindex</tt>, чтобы сгенерировать их индекс.
Использование <tt>mergedb</tt>:

<tscreen><verb>
        mergedb production automatic manual [manual ...]
</verb></tscreen>

Идея заключается в том, что <em>production</em> - окончательная база данных GDBM database, которую
будет обслуживать Gatherer. Это <em>новая</em> база данных, которая будет генерироваться из
других баз в командной строке. <em>automatic</em> - это база данных GDBM,
которую Gatherer сгенерировал в предыдущем запуске (наример,
<em>WORKING.gdbm</em> или предыдущая <em>PRODUCTION.gdbm</em>). <em>manual</em>
и т.д. - базы данных GDBM, которые вы создали вручную. Когда запускается mergedb,
она строит базу данных <em>production</em>, сперва скопировав шаблоны из
баз даных <em>manual</em>, а затем соединив с атрибутами атрибуты из
базы данных <em>automatic</em>. В случае конфликта (одни и те же атрибуты имеют
различные значения в базах <em>manual</em> и <em>automatic</em>),
значения <em>manual</em> перевесят значения <em>automatic</em>.

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

Пример использования <tt>mergedb</tt>:

<tscreen><verb>
        % mergedb PRODUCTION.new PRODUCTION.gdbm annotations.gdbm
        % mv PRODUCTION.new PRODUCTION.gdbm
        % mkindex
</verb></tscreen>

Если база данных manual выглядит так:

<tscreen><verb>
        @FILE { url1
        my-manual-attribute:  this is a neat attribute
        }
</verb></tscreen>

а база данных automatic выглядит так:

<tscreen><verb>
        @FILE { url1
        keywords:   boulder colorado
        file-size:  1034
        md5:        c3d79dc037efd538ce50464089af2fb6
        }
</verb></tscreen>

то в конце база данных production будет выглядеть вот так:

<tscreen><verb>
        @FILE { url1
        my-manual-attribute:  this is a neat attribute
        keywords:   boulder colorado
        file-size:  1034
        md5:        c3d79dc037efd538ce50464089af2fb6
        }
</verb></tscreen>

<sect1>Устранение неполадок

<p>
<descrip>
<tag/Отладка/
Доплнительная информация от отдельных программ и библиотечных функций может записана,
если установить отладочные флаги (debugging flags). Отладочный флаг имеет вид
<bf>-Dsection,level</bf>. <em>Section</em> -- это целое число в пределах 1-255, а
<em>level</em> -- целое число в пределах 1-9. Флаги могут быть заданы в
командной строке, при помощи тэга <bf>Debug-Options:</bf> в конфигурационном файле
Gatherer'а, или установлением переменной окружения <bf>$HARVEST_DEBUG</bf>.

Примеры:

<tscreen><verb>
        Debug-Options: -D68,5 -D44,1
        % httpenum -D20,1 -D21,1 -D42,1 http://harvest.cs.colorado.edu/
        % setenv HARVEST_DEBUG '-D20,1 -D23,1 -D63,1'
</verb></tscreen>

Разделы отладки (debugging sections) и уровни (levels) относятся к следующим разделам кода:
of the code:

<tscreen><verb>
section  20, level 1, 5, 9          liburl обработка URL
section  21, level 1, 5, 9          Функции HTTP библиотеки liburl
section  22, level 1, 5             Функции дискового кэша библиотеки liburl
section  23, level 1                Функции FTP библиотеки liburl
section  24, level 1                Функции Gopher библиотеки liburl
section  25, level 1                urlget - отдельная программа liburl
section  26, level 1                ftpget - отдельная программа liburl
section  40, level 1, 5, 9          Нумерация URL Gatherer'ом
section  41, level 1                Нумерация Gatherer'а, подтверждение URL
section  42, level 1, 5, 9          Нумерация Gatherer'а для HTTP
section  43, level 1, 5, 9          Нумерация Gatherer'а для Gopher
section  44, level 1, 5             Нумерация Gatherer'а, функции фильтра
section  45, level 1                Нумерация Gatherer'а для FTP
section  46, level 1                Нумерация Gatherer'а для URL'ов типа file://
section  48, level 1, 5             Нумерация Gatherer'а, robots.txt
section  60, level 1                Gatherer essence, обработка объекта данных
section  61, level 1                Gatherer essence, функции базы данных
section  62, level 1                Gatherer essence, главная часть (main)
section  63, level 1                Gatherer essence, распознавания типов
section  64, level 1                Gatherer essence, суммирование объектов
section  65, level 1                Gatherer essence, извлечение объектов
section  66, level 1, 2, 5          Gatherer essence, пост-суммирование
section  67, level 1                Gatherer essence, код ID объекта
section  69, level 1, 5, 9          Обработка шаблонов SOIF
section  70, level 1, 5, 9          Broker, регистр
section  71, level 1                Broker, функции коллекций
section  72, level 1                Broker, функции разбора SOIF
section  73, level 1, 5, 9          Broker, хэш-таблицы регистра
section  74, level 1                Broker, функции управления хранением
section  75, level 1, 5             Broker, функции обработки запросов
section  75, level 4                Broker, отладка query_list
section  76, level 1                Broker, функции обработки событий
section  77, level 1                Broker, main
section  78, level 9                Broker, цикл select(2)
section  79, level 1, 5, 9          Broker, управление gatherer-id
section  80, level 1                Общие утилиты, управление памятью
section  81, level 1                Общие утилиты, функции буфера
section  82, level 1                Общие утилиты, системные(3) функции
section  83, level 1                Общие утилиты, функции путей (pathname)
section  84, level 1                Общие утилиты, обработка имени хоста
section  85, level 1                Общие утилиты, обработка строк
section  86, level 1                Общие утилиты, кэш хостов DNS
section 101, level 1                Broker, движок индекса PLWeb
section 102, level 1, 2, 5          Broker, движок индекса Glimpse
section 103, level 1                Broker, движок индекса Swish
</verb></tscreen>

<tag/Симптом/
Gatherer <em>не собирает все объекты</em>, на которые указывают некоторые из моих
RootNode'ов.

<tag/Решение/
Gatherer делает различные ограничения на нумерацию, чтобы предостеречь
плохо сконфигурированный Gatherer от неправильного обращения к серверам или от ``дикого'' запуска. Обратитесь
в раздел <ref id="RootNode specifications" name="Описание RootNode">
за деталями о том, как переделать эти ограничения.

<tag/Симптом/
<em>Не сработало локальное преобразование (Local-Mapping)</em> - объекты получены по
обычным протоколам удаленного доступа.

<tag/Решение/
Локальное преобразование не удастся, если:

<itemize>
<item>Локальное преобразование не удастся, если:
<item>локальный файл - не регулярный файл;
<item>у локального файла установлены биты на исполнение.
</itemize>

Так, к каталогам, символическим ссылкам и сценариям CGI всегда обращается сервер,
а не локальная файловая система. Мы не предоставляем преобразование URL для локальных преобразований. Если ваш
URL имеет специальные символы, от которых нужно избавиться, то локальное преобразование также не удастя.
Добавьте опцию отладчика <bf>-D20,1</bf>, чтобы понять, как происходит локальное преобразование.

<tag/Симптом/
Используя опцию <bf>--full-text</bf>, я вижу много <em>необработанных данных</em> в
резюме содержимого, которые имеют мало ключевых слов для поиска.

<tag/Решение/
На данный момент <bf>--full-text</bf> просто включает все данные из содержимого в
резюме SOIF. Использование механизмов суммирования отдельных типов данных, описанных в
разделе
<ref id="Customizing the summarizing step"
name="Настройка шага суммирования">,
будет лучше работать в этом случае, но потребует от вас
указать, как нужно извлекать данные для отдельных типов файлов. В будущих
версиях Harvest'а мы заменим опцию Essence <bf>--full-text</bf>,
чтобы выполнять извлечение содержимого перед включением полного текста документов.

<tag/Симптом/
Не сгенерировались индексирующие термины в резюме SOIF для тэгов META
в моих документах HTML.

<tag/Решение/
Вероятно, это показывает, что ваш HTML синтаксически неверно организован,
и следовательно HTML summarizer на основе SGML не способен понять его. Обратитесь
в раздел
<ref id="Summarizing SGML data"
name="Суммирование данных SGML">
за деталями и опциями отладки.

<tag/Симптом/
Собранные данные <em>не обновляются</em>.

<tag/Решение/
Gatherer автоматически не производит периодических обновлений. Обратитесь в раздел
<ref id="Periodic gathering and realtime updates"
name="Периодическое собирание и обновления в реальном времени">
за деталями.

<tag/Симптом/
Gatherer записывает <em>немного другие URL</em> в резюме <em>SOIF</em>,
а не те, что я указал в <em>конфигурационном файле</em> Gatherer'а.

<tag/Решение/
Это происходит потому, что Gatherer пытается привести URL к каноническому
формату. Он делает это, убирая номера портов по умолчанию и похожие ``косметические''
изменения. Также по умолчанию Essence (подсистема Gtherer'а извлечения содержимого)
удаляет стандартные типы из stoplist.cf, который включает
запросы HTTP (состав cgi-bin).

<tag/Симптом/
Нет <em>Last-Modification-Time</em> (время последнего изменения) или <em>атрибутов MD5</em> в
моих данных SOIF, поэтому брокер не может делать повторного отсеивания.

<tag/Решение/
Если вы собираете удаленно созданную вручную информацию, она добывается
Harvest'ом, используя ``exploder'ы'', которые транслируют удаленный формат в SOIF.
Это значит, что они не имеют прямого способа заполнить информацию Last-Modification-Time
или MD5 за одну запись. Заметьте также, что это занчит, что после одного обновления удаленные
записи будут выглядеть обновленными, что приведет к
большей сетевой загрузке для брокера, который собирает данные с этого Gatherer'а. Как
решение, вы можете вычислять MD5 для всех объектов и хранить их как часть записи.
Потом, когда вы запустите exploder, вы сгенерируете только временные метки для тех объектов,
у которых изменилось MD5 - это даст вам реальные времена последних изменений.

<tag/Симптом/
Gatherer заменяет на ``%7e'' тильды ``~'' во всех URL'ах каталогов пользователя.
directory URLs.

<tag/Решение/
Gatherer следует
<htmlurl url="http://www.ietf.org/rfc/rfc1738.txt" name="RFC1738">,
который говорит, что
тильда внутри URL должна кодироваться как ``%7e'', так как она рассматривается как
``небезопасный'' символ.

<tag/Симптом/
Когда я ищу, используя ключевые слова, которые точно есть в документе, который я проиндексировал
Harvest'ом, <em>документ не находится</em>.

<tag/Решение/
Harvest использует подсистему извлечения содержимого <em>Essence</em>, которая по
умолчанию не извлекает каждое ключевое слово в документе. Вместо этого, она использует
эвристику, чтобы попытаться выбрать наиболее нужные ключевые слова. Вы можете установить, какие ключевые слова
выбирать настроив summarizer'ы для этих типов данных, что
обсуждается в разделе
<ref id="Customizing the type recognition, candidate selection, presentation unnesting, and
summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">.
Или вы можете сказать <em>Essence</em>, чтобы он использовал полнотекстовое суммирование,
если чувствуете, что увелечение занимаего места на диске будет оправдано, это обсуждается
в разделе
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">.

<tag/Симптом/
Я запускаю Harvest на HP-UX, но процесс <tt>essence</tt>
Gatherer'а <em>занимает слишком много памяти</em>.

<tag/Решение/
Имеющаяся библиотека регулярных выражений имеет утечки памяти на HP-UX, поэтому
вам нужно использовать библиотеку регулярных выражений, поставляемую с HP-UX. Замените
<em>Makefile</em> в <em>src/gatherer/essence</em>:

<tscreen><verb>
        REGEX_DEFINE    = -DUSE_POSIX_REGEX
        REGEX_INCLUDE   =
        REGEX_OBJ       =
        REGEX_TYPE      = posix
</verb></tscreen>

<tag/Симптом/
Я создал конфигурационный файл, чтобы <em>указать</em>, как Essence
должен извлекать данные types/content, но он <em>использует все равно
стандартные механизмы typing/extracting</em>.

<tag/Решение/
Убедитесь, что у вас <bf>Lib-Directory</bf> установлена в каталог <em>lib/</em>,
в который вы положили ваш конфигурационный файл. <bf>Lib-Directory</bf>
определяется в конфигурационном файле вашего Gatherer'а.

<tag/Симптом/
У меня проблемы с <em>разрешением имен хостов</em> на SunOS.

<tag/Решение/
Для того, чтобы собирать данные с хостов вне вашей организации, ваша
система должна быть способна разрешать полностью правильные имена доменов в адреса IP.
Если ваша система не может разрешить имена хостов, вы увидите сообщения об ошибках, как
``Unknown Host''. В этом случае, одно из двух:

<itemize>
<item>имя хоста, которое вы задали, на самом деле не существует;
<item>ваша система не сконфигурирована для использования  DNS.
</itemize>

Чтобы убедиться, что ваша система сконфигурирована для DNS, убедитесь, что файл
<em>/etc/resolv.conf</em> существует и может быть прочитан. Прочитайте страницу man для resolv.conf(5)
с информацией об этом файле. Вы можете убедиться, что DNS работает
при помощи команды <tt>nslookup</tt>.

Некоторые сайты могут использовать Службу сетевой информации Sun Microsystem (Network Information Service, NIS)
вместо или вместе с DNS. Мы считаем, что Harvest работает на системах,
в которых NIS был правильно сконфигурирован. Сервера NIS (имена которых
вы можете определить при помощи команды <tt>ypwhich</tt>) должны быть сконфигурированы, чтобы делать
запросы к серверам DNS для имен хостов, о которых они ничего не знают. Попробуте опцию <bf>-b</bf>
команды <tt>ypxfr</tt>.

<tag/Симптом/
Я не могу заставить Gatherer работать через наш <em>firewall gateway</em>.

<tag/Решение/
Harvest поддерживает только получение объектов HTTP через прокси. Пока еще
невозможно запросить Gopher и FTP объекты через firewall. Для этих
объектов, вам может понадобиться запустить Harvest внутренне (за firewall'ом) или
на самом хосте с firewall'ом.

Если вы видите сообщение ``Host is unreachable'', вероятно, возникли эти проблемы:

<itemize>
<item>ваше соединение с Internet временно невозможно из-за сбоя в цепи или маршрутизации;
<item>вы за firewall'ом.
</itemize>

Если вы видите сообщение ``Connection refused'', вероятно, проблема в том, что
вы пытаетесь подсоединиться к неиспользуемому порту на машине назначения. Другими словами,
нет программы, прослушивающей соединения на этом порту.

Gatherer Harvest'а - это, по существу, клиент WWW. Вы должны ожидать, что он
будет работать так же как и любой Web броузер.
</descrip>

<sect>Broker
<label id="The Broker">

<p>

<sect1>Обзор

<p>
Broker получает индексную информацию от Gatherer'ов и других
брокеров и управляет ею, а также предлагает вебинтерфейс для запросов к индексируемой информации.

<sect1>Начальная установка

<p>
Брокер автоматически запускается командой <tt>RunHarvest</tt>.
Другие подобные команды описываются в разделе
 <ref id="Starting up the system: RunHarvest and related commands"
name="Запуск системы: команда RunHarvest и связанные с ней команды">.

В этом разделе мы обсуждаем различные способы переделки и настройки брокера,
как администрировать брокер и различные программные интерфейсы брокера.

Как показано на рисунке
<ref id="img1" name="1">,
брокер использует гибкий интерфейс индексирования, который поддерживает множество
подсистем индексирования. По умолчанию брокер Harvest'а использует
<htmlurl url="http://webglimpse.org/gdocs.html" name="Glimpse">
в качестве индексатора, но также
с брокером работают другие индексаторы, как Swish и WAIS (как свободный
<url url="ftp://ftp.cnidr.org/pub/software/freewais/" name="freeWAIS">,
так и коммерческий
WAIS) (см. раздел
<ref id="Using different index/search engines with the Broker"
name="Использование различных индексирующих/поисковых систем вместе с Broker'ом">).

Для создания нового брокера запустите программу <tt>CreateBroker</tt>. Она
задаст вам ряд вопросов о том, как бы вы хотели сконфигурировать ваш брокер, а
потом атоматически создаст и сконфигурирует его. Для запуска вашего брокера используйте
программу <tt>RunBroker</tt>, которую создаст <tt>CreateBroker</tt>.
Брокер должен запускаться при перезапуске вашей системы. Чтобы предотвратить брокер
от коллекционирования при запуске, используйте опцию <bf>-nocol</bf>. Есть много способов,
которыми вы можете переделать и настроить брокер, обсуждаемые в разделах
<ref id="Tuning Glimpse indexing in the Broker"
name="Настройка индексирования Glimpse в Broker'е "> и
<ref id="Using different index/search engines with the Broker"
name="Использование различных индексирующих/поисковых систем вместе с Broker'ом">.
Вы также можете использовать
команду <tt>RunHarvest</tt>, рассматриваемую в разделе
<ref id="Starting up the system: RunHarvest and related commands"
name="Запуск системы: команда RunHarvest и связанные с ней команды">,
чтобы создать как брокер, так и Gatherer.

<sect1>Отправление запросов Broker'у
<label id="Querying a Broker">

<p>
Брокер Harvest'а может работать с различными типами запросов. Запросы, обрабатываемые
отдельным брокером, зависят от того, какая индексируюшая/поисковая система используется внутри его
(например, WAIS не поддерживает некоторые из запросов, которые поддерживает Glimpse). В этом
разделе мы описываем весь синтаксис. Если данный брокер не поддерживает
определенный тип запросов, он вернет ошибку, когда пользователь совершит запрос такого типа.

Простейшие запросы - это отдельные ключевые слова, например:

<tscreen><verb>
        lightbulb
</verb></tscreen>

Поиск по общеупотребительным словам (как ``computer'' или ``html'') может занять много
времени.

В частности для больших брокеров часто полезно использовать более мощные
запросы. Harvest поддерживает много раздичных индексирующих/поисковых движков с разными
возможностями. На данный момент, наш самый мощный (и чаще используемый) поисковый движок --
<htmlurl url="http://webglimpse.org/gdocs.html" name="Glimpse">,
который поддерживает:

<itemize>
<item>запросы с учетом и без учета регистра;
<item>поиск по частям слова, целым словам, или фразам из нескольких слов (как
      ``обнаружение ресурсов'');
<item>булевские (И/ИЛИ) комбинации ключевых слов;
<item>приблизительные сопоставления (например, позволяя допускать ошибки в написании);
<item>структурированные запросы (которые дают вам возможность совершать поиск по
      определенным атрибутам);
<item>вывод совпавших строк или целыз записей (например, для цитирования);
<item>указание пределов на число возвращаемых совпадений;
<item>ограниченную форму регулярных выражений (например, позволяя задавать
      выражения, которые подходят ко всем словам, оканчивающимся на данный суффикс).
</itemize>

Ниже описываются различные типы запросов (и как их использовать).
Заметьте, что вы используете тот же синтаксис, независимо от, того какой движок
запущен в данном брокере, но не все движки поддерживают все вышеперечисленные
свойства. В частности, некоторые брокеры используют WAIS, который иногда
ищет быстрее, чем Glimpse, но поддерживает только булевские комбинации в запросах и возможность
указать ограничения на количество выдаваемых результатов.

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

Структурированный запрос имеет вид:

<tscreen><verb>
        tag-name : value
</verb></tscreen>

Где <em>tag-name</em> -- это имя атрибута резюме содержимого, а
<em>value</em> - значание для поиска по этому атрибуту. Если вы кликните на
резюме содержимого (Content Summary), вы увидите, какие атрибуты доступны для данного брокера.
Список наиболее общих атрибутов показан в разделе
<ref id="List of common SOIF attribute names"
name="Список общих имен атрибутов SOIF ">.

Поиск по ключевым словам и структурированные запросы могут быть объединены, используя булевские
операторы (AND и OR) для образования сложных запросов. Без скобок логические
операции применяются слева направо. Для фраз с несколькими словами или регулярными
выражениями вы должны заключать строки в двойные кавычки, например,

<tscreen><verb>
        &quot;internet resource discovery&quot;
</verb></tscreen>

или

<tscreen><verb>
        &quot;discov.*&quot;
</verb></tscreen>

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

<sect2>Примеры запросов

<p>
<descrip>
<tag/Запрос для простого поиска по ключевому слову:/
<em>Arizona</em>

тот запрос вернет все объекты брокера, содержащие слово
<em>Arizona</em>.

<tag/Булевский запрос:/
<em>Arizona AND desert</em>

Этот запрос веренеи все объекты содержащие оба слова
где угодно в объекте в любом порядке.

<tag/Запрос с фразой:/
<em>&quot;Arizona desert&quot;</em>

Этот запрос вернет все объекты брокера, которые содержат <em>Arizona
desert</em> как фразу. Заметьте, что вокруг фразы нужно ставить двойные кавычки.

<tag/Булевские запросы с фразами:/
<em>&quot;Arizona desert&quot; AND windsurfing</em>

Этот запрос вернет все объекты брокера, которые содержат <em>Arizona
desert</em> как фразу и слово <em>windsurfing</em>.

<tag/Простой структурированный запрос:/
<em>Title : windsurfing</em>

Этот запрос вернет все объекты брокера, в которых атрибут <em>Title</em>
содержит значение <em>windsurfing</em>.

<tag/Сложный запрос:/
<em>&quot;Arizona desert&quot; AND (Title : windsurfing)</em>

Этот запрос вернет все объекты брокера, которые содержат фразу
<em>Arizona desert</em> и в которых атрибут <em>Title</em> содержит
значение <em>windsurfing</em>.
</descrip>

<sect2>Регулярные выражения

<p>
Glimpse поддерживает некоторые типы регулярных выражений. Поиск по
регулярным выражениям может быть намного медленне других типов поиска. Далее следует
частичный список возмошных шаблонов. (За деталями обратитесь к
<htmlurl url="http://webglimpse.org/gdocs.html"
name="документации Glimpse">.)

<itemize>
<item><em>^joe</em> соответствует ``joe'' в начале строки.
<item><em>joe$</em> соответствует ``joe'' в конце строки.
<item><em>&lsqb;a-ho-z&rsqb;</em> соответствует любому символу между ``a'' и ``h'' или между
      ``o'' и ``z''.
<item><em>.</em> соответствует одному произвольному символу кроме символа новой строки.
<item><em>c*</em> соответствует произвольному числу символов ``c'' или ни ондного такого символа.
<item><em>.*</em> соотвествует произвольному числу любых символов кроме новой строки.
<item><em>\*</em> соответствует символу ``*''. (<em>\</em> позволяет передать любой из
      вышеуказанных спецсимволов.)
</itemize>

Регулярные выражения на данный момент ограничены по длине до приблизительно 30 символов, не
включая метасимволы. Регулярные выражения обычно не будут переступать за границы слов
(так как в индексе хранятся только слова). Так, например,
<em>``lin.*ing''</em> найдет ``linking'' или ``flinching'', но не ``linear
programming''.

<sect2>Опции запросов, выбираемые в меню или кнопками

<p>
Страница запросов может иметь следующие меню (типа checkbox), чтобы позволить контролировать
спецификацию запроса.

<descrip>
<tag/Без учета регистра:/
При выборе этого меню запрос станет нечувствительным к регистру (заглавные
и строчные буквы не различаются). В противном случае запрос будет чувствительным
к регистру. По умолчанию - без учета регистра.

<tag/Сопоставление ключевых слов по границам слов:/
При выборе этого меню ключевые слова будут сопоставляться по границам слов.
В противном случае ключевое слово будет сопоставляться части слова (или фразы). Например,
``network'' сопоставится с ``networking'', ``sensitive'' сопоставится с ``insensitive'',
и ``Arizona desert'' сопоставится с ``Arizona desertness''. По умолчанию --
сопоставление по границам слов.

<tag/Число допустимых ошибок:/
Glimpse позволяет запросу содержать некоторое число ошибок. Ошибка -- это или
удаление, вставка или замещение одного символа. Опция лучшее сопоставление (Best Match)
найдет сопоставление (-ия) с наименьшим числом ошибок. По умолчанию --
0 (ноль) ошибок.
</descrip>

<em>Примечание:</em> Предыдущие три опции не применяются к именам атрибутов.
Имена атрибутов всегда чувствительны к регистру и не допускают ошибок.

<sect2>Фильтрование результатов запроса

<p>
Harvest позволяет фильтровать результаты запроса по любому из частей запроса, используя атрибуты,
определенные в разделе
<ref id="List of common SOIF attribute names"
name="Список общих имен атрибутов SOIF">.
Это делается определением параметров <bf>filter</bf>
в форме запросов. Можно определить больше, чем один параметр фильтра;
они будут конкатенированы булевым <bf>И</bf>. Параметры фильтра
состоят из двух частей, разделенных вертикальной чертой ``|''. Первая часть - это
выражение запроса, которое прикрепляется к запросу пользователя, используя <bf>AND</bf> перед
отправлением запроса брокеру. Опциональная вторая часть -- это текст HTML, который
будет показываться на странице результатов для того, чтобы дать пользователю некоторую информацию по
примененному фильтру.

Пример:

       <tscreen><verb>
       &lt;SELECT NAME=&quot;filter&quot;&gt;
       &lt;OPTION VALUE=''&gt;Нет фильтра
       &lt;OPTION VALUE='uri: &quot;xyz\.edu&quot;|Seach only xyz.edu'&gt;Искать только xyz.edu
       &lt;OPTION VALUE='type: html|HTML documents only'&gt;Искать только документы HTML
       &lt;/SELECT&gt;
</verb></tscreen>

Первая опция везвращает неотфильтрованный результат. Вторая опция возвращает только
страницы с ``xyz.edu'' в их URL'ах. Третья опция возвращает
только документы HTML. Обратитесь на страницу расширенного поиска брокера за другими примерами.

<sect2>Представление результатов

<p>
Страница может иметь следующие чекбоксы, которые позволяют контролироватьf
представление результатов запроса.

<descrip>
<tag/Показать совпавшие строки (из резюме содержимого):/
При выборе этого меню, результат будет содержать
строки из резюме содержимого, которые удовлетворили запросу. В противном случае, совпавшие
строки не будут показаны. По умолчанию -- показывать совпавшие строки.

<tag/Показывать описания объектов (если доступно):/
Некоторые бъекты имеют короткие, в одну строчку, описания. При
выборе этого меню будут показываться описания. В противном случае
описания объектов не будут показываться. По умолчанию -- показывать описания.

<tag/Показывать ссылки к проиндексированному резюме содержимого:/
Это меню позволяет вам выбрать, показывать ли ссылки на проиндексированные
резюме объектов. По умолчанию -- не показывать.
</descrip>

<sect1>Настройка выдаваемого результата на запрос Broker'у

<p>
Администратору Harvest'а можно настроить, как будет генерироваться
результат запроса брокеру. Это можно сделать, модифицируя конфигурационный файл, который
читается программой Perl <tt>search.cgi</tt> во время выполнения запроса.

<tt>search.cgi</tt> позволяет настроить почти любой аспект его
HTML-выхода. Файл <em>$HARVEST_HOME/cgi-bin/lib/search.cf</em> содержит
определения выхода по умолчанию. Отдельные брокеры могуть быть настроены путем создания
похожего файла, который заменит определения по умолчанию.

<sect2>Конфигурационный файл search.cf
<label id="The search.cf configuration file">

<p>
Определения заключаются в начальные и конечные тэги типа SGML. Например:

<tscreen><verb>
        &lt;HarvestUrl&gt;
        http://harvest.sourceforge.net/
        &lt;/HarvestUrl&gt;
</verb></tscreen>

Последний символ новой строки удаляется из каждого определения, так что вышеуказанная
строка станет ``http://harvest.sourceforge.net/''.

Подстановка переменной происходит для каждого определения перед выводом.
Некоторые особые переменные определены в <tt>search.cgi</tt>, которые могут
использоваться внутри определения. Например:

<tscreen><verb>
        &lt;BrokerLoad&gt;
        Sorry, the Broker at &lt;STRONG&gt;$host, port $port&lt;/STRONG&gt;
        is currently too heavily loaded to process your request.
        Please try again later.&lt;P&gt;
        &lt;/BrokerLoad&gt;
</verb></tscreen>

Когда определения будут печататься, переменные <em>$host</em> и
<em>$port</em> будут заменены на имя хоста и порт брокера.

<sect3>Определенные переменные

<p>
Следующие переменные определяются как только начинает обрабатываться строка запроса.
Они могут быть использованы перед тем, как брокер вернет какой-либо результат.

<tscreen><verb>
        $maxresult    максимальное возвращаемое число совпавших строк
        $host         имя хоста брокера
        $port         порт брокера
        $query        строка запроса, введенная пользователем
        $bquery       полная строка запроса, посланная брокеру
</verb></tscreen>

Эти переменные определены для каждого объекта, удовлетворяющего запросу (подходящего),
выдаваемого брокером.

<tscreen><verb>
        $objectnum   число возращаемых объектов
        $desc        атрибут описания подходящих объектов
        $opaque      ВСЕ совпавшие строки из подходящих объектов
        $url         Первоначальный URL of the matched object
        $A           метод доступа к $url (например, http)
        $H           имя хоста (включая порт) из $url
        $P           часть $url, содержащая путь
        $D           часть $P с именем каталога
        $F           часть $P с именем файла
        $cs_url      URL резюме содержимого в базе данных брокера
        $cs_a        часть $cs_url с методом доступа
        $cs_h        часть $cs_url с именем хоста
        $cs_p        часть $cs_url, содержащая путь
        $cs_d        часть $cs_p с именем каталога
        $cs_f        часть $cs_p с именем файла
</verb></tscreen>

<sect3>Список определений

<p>
Ниже приведен частичный список определений. Полный список можн найти
в файле search.cf. Здесь описаны только определения, которые, возможно, вам захочется изменить.

<descrip>
<tag><bf>&lt;Timeout&gt;</bf></tag>
Значение времени ожидания для <tt>search.cgi</tt>. Если брокер не отвечает
в течение этого времени, <tt>search.cgi</tt> выходит.

<tag><bf>&lt;ResultHeader&gt;</bf></tag>
Первая часть страницы результатов. Должно вероятно содержать элемент HTML
<bf>&lt;TITLE&gt;</bf> и строку запроса пользователя.

<tag><bf>&lt;ResultTrailer&gt;</bf></tag>
Последняя часть страницы результатов. По умолчанию имеет ссылки URL к домашней странице
брокера и домашней странице проекта Harvest.

<tag><bf>&lt;ResultSetBegin&gt;</bf></tag>
Это вывод прямо перед циклом по всем подходящим объектам.

<tag><bf>&lt;ResultSetEnd&gt;</bf></tag>
Это вывод сразу после завершения цикла по объектам.

<tag><bf>&lt;PrintObject&gt;</bf></tag>
Это определение печатает подошедший объект. Оно, возможно, должно включать
переменные <em>$url, $cs_url, $desc</em> и <em>$opaque</em>.

<tag><bf>&lt;EndBrokerResults&gt;</bf></tag>
Печатается между <bf>&lt;ResultSetEnd&gt;</bf> и
<bf>&lt;ResultTrailer&gt;</bf>, если запрос был успешным. Вероятно, должно
включать число найденных объектов и/или совпавших строк.

<tag><bf>&lt;FailBrokerResults&gt;</bf></tag>
Похоже на <bf>&lt;EndBrokerResults&gt;</bf>, но печатается, если вернул ошибку
в ответ на запрос.

<tag><bf>&lt;ObjectNumPrintf&gt;</bf></tag>
Формат <tt>printf</tt> строки для объекта под номером
(<em>$objectnum</em>).

<tag><bf>&lt;TruncateWarning&gt;</bf></tag>
Печатает предупреждающее сообщение, если результат был усечен до максимального
числа совпавших строк.
</descrip>

Следующие определения немного отличаются, так как они определяются
как инструкции Perl, а не строки.

<descrip>
<tag><bf>&lt;MatchedLineSub&gt;</bf></tag>
Определяется для каждой совпавшей строки, возвращаемой брокером. Может быть использовано для
разделения совпавших строк или, чтобы удалить главную ``совпавшую строку'' и строки с именами атрибутов.

<tag><bf>&lt;InitFunction&gt;</bf></tag>
Определяется вначале программы <tt>search.cgi</tt>. Может быть
использовано для установки специальных переменных или чтения файлов данных.

<tag><bf>&lt;PerObjectFunction&gt;</bf></tag>
Определяется для каждого объекта прямо перед вызовом <bf>&lt;PrintObject&gt;</bf>.

<tag><bf>&lt;FormatAttribute&gt;</bf></tag>
Определяется для каждого атрибута SOIF, запрошенного для подходящего объекта (см.
раздел
<ref id="Displaying SOIF attributes in results"
name="Выдача атрибутов SOIF в результатах">
<em>$att</em> установлено для имени атрибута,
а <em>$val</em> установлено для значения атрибута.
</descrip>

<sect2>Пример файла настроек search.cf

<p>
Следующие определения демонстрируют, как менять вывод
<tt>search.cgi</tt>. <bf>&lt;PerObjectFunction&gt;</bf>, что
определение не пусто. Оно также присоединяется спереди к строке ``matched data:''
перед любой совпавшей строкой. Определение <bf>&lt;PrintObject&gt;</bf> печатает
номер объекта, описание и индексные данные, все в первой строчке.
Описание располагается вокруг тэгов привязки HMTL (anchor tags), так что оно становится ссылкой
на первоначально созданный объект. Слова ``indexing data'' - ссылка на
программу displaySOIF, которая отфрматирует резюме содержимого для броузеров HTML.
Номер объекта отформатирован как число в скобках, такое что все вместе занимает
до четырех символов.

Определение <bf>&lt;MatchedLineSub&gt;</bf> включает четыре замещающих выражения.
Первое удаляет слова ``Matched line'': в начале
каждой совпавшей строчки. Второе удаляет атрибуты SOIF вида
``<em>partial-text{43}:</em>'' вначале каждой строки. Третье показывает
имена атрибутов (например, <em>partial-text#</em>) курсивом. Последнее
выражение разделяет каждую строку пятью пробелами и располагает ее вместе со строкой описания.
Опрделение <bf>&lt;EndBrokerResults&gt;</bf> слегка модифицирует
отчет о том, сколько объектов было найдено.

<tscreen><verb>
        # Пример показывает некоторые особенности настройки вывода Harvest'а
        # Больше информации можно найти на:
        # http://harvest.sourceforge.net/harvest/doc/html/manual.html


        # PerObjectFunction - это код Perl определенный для каждого совпадения
        &lt;PerObjectFunction&gt;
        # Создаем описание
        # Являются ли описания, предоставленные Harvest'ом очень короткими (например, пропущен &lt;TITLE&gt;)?
        if (length($desc) &lt; 5) {
          # Да: использовать вместо него имя файла ($F)
          $description = "&lt;I&gt;File:&lt;/I&gt; $F";
        } else {
          # Нет: использовать описание Harvest'а
          $description = $desc;
        }

        # Форматируем совпавшие строки ("мутные данные") если данные есть
        if ($opaque ne '') {
          $opaque = "&lt;strong&gt;matched lines:&lt;/strong&gt;&lt;BR&gt;$opaque"
        }
        &lt;/PerObjectFunction&gt;


        # PrintObject определяет появление совпадений
        &lt;PrintObject&gt;
        $objectnum &lt;A HREF=&quot;$url&quot;&gt;&lt;STRONG&gt;$description&lt;/STRONG&gt;&lt;/A&gt; \
        [&lt;A HREF=&quot;$cs_a://$cs_h/Harvest/cgi-bin/displaySOIF.cgi?object=$cs_p&quot;&gt;\
        indexing data&lt;/A&gt;]
        &lt;pre&gt;
             $opaque
        &lt;/pre&gt;\n
        &lt;/PrintObject&gt;


        # Форматируем появление числа совпадений
        &lt;ObjectNumPrintf&gt;
        (%2d)
        &lt;/ObjectNumPrintf&gt;


        # Форматируем появление каждой совпавшей строки
        &lt;MatchedLineSub&gt;
        s/^Matched line: *//;            # Remove "Matched line:"
        s/^([\w-]+# )[\w-]+{\d+}:\t/\1/; # Remove SOIF attributes of the form "partial-text{43}:"
        s/^([\w-]+#)/&lt;I&gt;\1&lt;\/I&gt;/;        # Format attribute names as italics
        s/^.*/     $&amp;/;                  # Add spaces to indent text
        &lt;/MatchedLineSub&gt;


        # Модифицируем отчет о том, сколько объектов было найдено
        &lt;EndBrokerResults&gt;
        &lt;STRONG&gt;Found $nopaquelines matched lines, $nobjects objects.&lt;/STRONG&gt;
        &lt;P&gt;\n
        &lt;/EndBrokerResults&gt;
</verb></tscreen>

<sect2>Интегрирование ваших настроенных конфигурационных файлов

<p>
Конфигурационные файлы <tt>search.cgi</tt> хранятся в
<em>$HARVEST_HOME/cgi-bin/lib</em>. Имя настроенного файла занесено в список
формы <em>query.html</em> и передано как опция программе
<tt>search.cgi</tt>.

Самый простой способ определить настроенный файл -поместить тэг
<bf>&lt;INPUT&gt;</bf> в форму  HTML:

<tscreen><verb>
        &lt;INPUT TYPE=&quot;hidden&quot; NAME=&quot;brokerqueryconfig&quot; VALUE=&quot;custom.cf&quot;&gt;
</verb></tscreen>

Другой способ - позволить пользователям выбирать различные настройки при помощи списка
<bf>&lt;SELECT&gt;</bf>:

<tscreen><verb>
        &lt;SELECT NAME=&quot;brokerqueryconfig&quot;&gt;
        &lt;OPTION VALUE=&quot;&quot;&gt; Default
        &lt;OPTION VALUE=&quot;custom1.cf&quot;&gt; Customized
        &lt;OPTION VALUE=&quot;custom2.cf&quot; SELECTED&gt; Highly Customized
        &lt;/SELECT&gt;
</verb></tscreen>

<sect2>Выдача атрибутов SOIF в результатах
<label id="Displaying SOIF attributes in results">

<p>
Можно запросить атрибуты SOIF из формы запросов HTML. Простое
приближение - включить список select в форму запросов:

<tscreen><verb>
        &lt;SELECT MULTIPLE NAME=&quot;attribute&quot;&gt;
        &lt;OPTION VALUE=&quot;title&quot;&gt;
        &lt;OPTION VALUE=&quot;author&quot;&gt;
        &lt;OPTION VALUE=&quot;date&quot;&gt;
        &lt;OPTION VALUE=&quot;subject&quot;&gt;
        &lt;/SELECT&gt;
</verb></tscreen>

Таким образом пользователь может контролировать, какие атрибуты показывать.
Расположение этих атрибутов при выводе результатов в HTML контролируется
инструкцией <bf>&lt;FormatAttribute&gt;</bf> в файле <em>search.cf</em>,
оисанном в разделе
<ref id="The search.cf configuration file"
name="Конфигурационный файл search.cf">.

<sect1>Описание интерфейса World Wide Web

<p>
Чтобы позволить броузерам легко взаимодействовать с брокером, мы реализовали
WWW интерфейсы: административный и менеджер запросов брокеру.
Эти WWW интерфейсы, которые включают несколько файлов HTML и несколько
программ, использующих <htmlurl
url="http://hoohoo.ncsa.uiuc.edu/cgi/overview.html" name="Common
Gateway Interface"> (CGI),
состоят из:

<itemize>
<item>файлов HTML, использующих
      <htmlurl url="http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/fill-out-forms/overview.html"
      name="формы">
      для предоставления пользователю графического пользовательского интерфейса -- graphical user interface (GUI);
<item>CGI программы, которые действуют как шлюз между пользователем и брокером;
<item>файлы помощи для пользователя.
</itemize>

Пользователи проходят через следующие шаги при использовании брокера для обнаружения
информации:

<enum>
<item>Пользователь отправляет запрос брокеру.
<item>Брокер обрабатывает запрос и возвращает результаты запроса пользователю.
<item>Затем пользователь может посмотреть резюме содержимого из набора результатов, или прямо
      пойти по указанному URL в наборе результатов.
</enum>

Чтобы предоставить WWW-интерфейс, брокер должен быт запущен вместе с сервером
HTTPr. Раздел
<ref id="Additional installation for the Harvest Broker"
name="Дополнительная установка для Harvest Broker">
описывает, как как конфигурировать ваш HTTP
сервер для работы с Harvest.

Вы можете запустить брокер не на той машине, на которой запущен сервер HTTP,
но если вы хотите, чтобы пользователи могли видеть резюме содержимого брокера, тогда
файлы брокера должны быть доступны вашему серверу HTTP. Вы можете подмонтировать по NFS
те файлы или вручную скопировать их. Вам также понадобится изменить файл
<em>Brokers.cf</em> и указать на хост, где запущен брокер.

<sect2>Файлы HTML для графического пользовательского интерфейса

<p>
<tt>CreateBroker</tt> создает несколько файлов HTML и предоставляет GUI пользователю:

<descrip>
<tag><em>query.html</em></tag>
Содержит GUI для интерфейса запросов. <tt>CreateBroker</tt> установит
разные файлы <em>query.html</em> для Glimpse, Swish и WAIS,
так как каждая подсистема требует различных установок по умолчанию и поддерживает
разную функциональность (например, WAIS не поддерживает приблизительный поиск, в отличие от Glimpse).
Это также ``домашняя страница'' для брокера и ссылка на нее включена
внизу во всех страницах результатов запросов.

<tag><em>admin.html</em></tag>
Содержит GUI для административного интерфейса. Это файл устанавливается в
каталог <em>admin</em> брокера.

<tag><em>Brokers.cf</em></tag>
Содержит информацию об именах хостов и портах поддерживаемых брокеров. Этот
файл устанавливается в каталог <em>$HARVEST_HOME/brokers</em>. Файл
<em>query.html</em> использует значение тэга FORM ``broker'', чтобы передать
имя брокера <tt>search.cgi</tt>, который в свою очередь получает имя хоста и порт
из <em>Brokers.cf</em>.
</descrip>

<sect2>Программы CGI
<label id="CGI programs">

<p>
Когда вы устанавливаете WWW интерфейс (см. раздел
<ref id="The Broker" name="The Broker">),
несколько программ устанавливаются в каталог
<em>/Harvest/cgi-bin</em> вашего сервера HTTP:

<descrip>
<tag><tt>search.cgi</tt></tag>
Эта программа берет отправленный запрос из <em>query.html</em> и посылает
его указанному брокеру. Затем она получает результаты запроса от
брокера, форматирует его в HTML и отправляет пользователю.

<tag><tt>displaySOIF.cgi</tt></tag>
Эта программа показывает резюме содержимого объектов брокера.

<tag><tt>BrokerAdmin.pl.cgi</tt></tag>
Эта программа принимает административную команду из
<em>admin.html</em> и отправляет ее соответствующему брокеру. Она получает
результат от брокера и выдает его пользователю.
</descrip>

<sect2>Файлы помощи пользователю

<p>
WWW интерфейс брокера включает несколько файлов помощи, написанных на HTML.
Эти файлы устанавливаются на ваш сервер HTTP в каталог <em>/Harvest/brokers</em>,
когда вы устанавливаете брокер (см. раздел
<ref id="The Broker" name="Broker">):

<descrip>
<tag><em>queryhelp.html</em></tag>
Предоставляет учебное пособие по построению запросов брокеру и использованию
форм <em>query.html</em>. <em>query.html</em> имеет ссылку на эту страницу.

<tag><em>adminhelp.html</em></tag>
Предоставляет учебное пособие по отправдению брокеру административных команд, используя
форму <em>admin.html</em>. <em>admin.html</em> имеет ссылку на эту страницу.

<tag><em>soifhelp.html</em></tag>
Предоставляет краткое описание SOIF.
</descrip>

<sect1>Администрирование Broker'а
<label id="Administrating a Broker">

<p>
У администраторов есть два основных способа управления брокером: через
конфигурационные файлы <em>broker.conf</em> и <em>Collection.conf</em>, и
через интерактивный административный интерфейс. Интерактивный интерфейс
контролирует разные средства и действующие параметры в брокере. Мы
предоставляем HTML интерфейс для этих административных команд. Обратитесь в раздел
<ref id="Collector interface description: Collection.conf"
name="Описание интерфейса коллектора: Collection.conf">
за дополнительной информацией о
интерфейсе коллектора и административном интерфейсе брокера.

Файл <em>broker.conf</em> - это список имен переменных и их значений,
который состоит из информации о брокере (такой как каталог, где он
находится) и порт, на котором он запущен. Файл <em>Collection.conf</em> (обратитесь
в раздел
<ref id="Collector interface description: Collection.conf"
name="Описание интерфейса коллектора: Collection.conf">
за примером) - это список
точек коллекционирования, откуда брокер будет собирать свою индексную информацию.
Программа <tt>CreateBroker</tt> автоматически генерирует оба эти
конфигурационные файла. Вы можете вручную отредактировать их в случае необходимости.

Программа <tt>CreateBroker</tt> также создает файл <em>admin.html</em>,
который является административным интерфейсом для команд брокеру. Заметьте,
что все административные команды требуют пароль, определенный в
<em>broker.conf</em>.

<em>Замечание:</em> Изменения конфигурации брокера не сохраняются при перезапуске
брокера. Постоянные изменения конфигурации брокера должны быть
сделаны вручную редактированием файла <em>broker.conf</em>.

Административный интерфейс, созданный <tt>CreateBroker</tt>, имеет следующие
поля:

<tscreen><verb>
Command         Выбрать административную команду.  Ниже приведено описание
                команд.
Parameters      Указать параметры для тех команд, для которых это необходимо.
Password        Административный пароль.
Broker Host     Хост, на котором запущен брокер.
Broker Port     Порт, который прослушивает брокер.
</verb></tscreen>

Административный интерфейс, созданный <tt>CreateBroker</tt>, поддерживает
следующие команды:

<descrip>
<tag><bf>Add objects by file:</bf></tag>
Добавить объект(ы) брокеру. Параметр -- список файлов,
содержащих объекты SOIF, которые нужно добавить.

<tag><bf>Close log:</bf></tag>
Записать всю накопленную лог-информацию и закрыть текущий лог-файл.
Заставляет брокер прекратить вести логи. Параметров нет.

<tag><bf>Compress Registry:</bf></tag>
Предоставляет сбор мусора в файле реестра. Параметров нет.

<tag><bf>Delete expired objects:</bf></tag>
Удалить все объекты из брокера, у которых истекло время жизни <em>Time-to-Live</em>.
Параметров нет.

<tag><bf>Delete objects by query:</bf></tag>
Удаляет все объекты, которые удовлетворяют данному запросу. Параметр --
запрос с таким же синтаксисом, как и пользовательский запрос. Флаги запросов на данный момент
не поддерживаются.

<tag><bf>Delete objects by oid:</bf></tag>
Удалить объекты(ы), указанные данными числами OID. Параметр --
список чисел OID. Числа OID могут быть получены, используя
команду <tt>dumpregistry</tt>.

<tag><bf>Disable log type:</bf></tag>
Отменяет ведение лог-информации о данном типе событий.
Параметр -- тип события. Чтобы посмотреть список событий, см. ``Включить логи по типу''.

<tag><bf>Enable log type:</bf></tag>
Включает ведение лог-информации о данном типе событий.
Параметр -- имя типа события. Сейчас типы событий ограничены следующим набором:

<tscreen><verb>
Update                  Вести логи по обновленным объектам.
Delete                  Вести логи по удаленным объектам.
Refresh                 Вести логи по восстановленным объектам.
Query                   Вести логи по запросам пользователей.
Query-Return            Вести логи по объектам, возвращенным на запрос.
Cleaned                 Вести логи по объектам, удаленным уборщиком (cleaner).
Collection              Вести логи о коллекционировании.
Admin                   Вести логи об административных событиях.
Admin-Return            Вести логи о результатах административных событий.
Bulk-Transfer           Вести логи о событиях с с болшой передачей данных.
Bulk-Return             Вести логи об объектах, отправленных при большой передаче.
Cleaner-On              Вести логи о событиях очистки.
Compressing-Registry    Вести логи о сжатии реестра.
All                     Вести логи о всех событиях.
</verb></tscreen>

<tag><bf>Flush log:</bf></tag>
Записать всю накопленную лог-информацию в текущий лог-файл. Параметров
нет.

<tag><bf>Generate statistics:</bf></tag>
Генерирует основную статистику об объектах брокера в базе данных.
Параметров нет.

<tag><bf>Index changes:</bf></tag>
Индексировать только объекты, которые были добавлены недавно. Параметров нет.

<tag><bf>Index corpus:</bf></tag>
Индексировать <em>всю</em> базу данных объектов. Параметров нет.

<tag><bf>Open log:</bf></tag>
Открывает новый лог-файл. Если файл не существует, создает новый.
Параметр - имя (относительно брокера) файла для логов.

<tag><bf>Restart server:</bf></tag>
Заставляет брокер прочитать заново реестр и переиндексировать все. Процесс
брокера на самом деле не убивается. Параметров нет.

<tag><bf>Rotate log file:</bf></tag>
Заменяет текущий лог-файл на LOG.YYYYMMDD. Открывает новый лог-файл. Параметров нет.

<tag><bf>Set variable:</bf></tag>
Устанавливает значение переменной конфигурации брокера. Принимаеи два параметра,
имя переменной и ее новое значение.
Переменные конфигурации, которые можно установить -- те, которые встречаются в файле
<em>broker.conf</em>. Изменение действительно до тех пор, пока процесс брокера не умрет.

<tag><bf>Shutdown server:</bf></tag>
Очевидно останавливает сервер. Параметров нет.

<tag><bf>Start collection:</bf></tag>
Начинает сбор. Параметров нет.

<tag><bf>Delete older objects of duplicate URLs:</bf></tag>
Иногда брокер может прекратить работать с продублированными резюме для некоторых
URL. Это может случиться, когда Gatherer меняет свое описание, имя хоста или
номер порта. Используйте эту команду, чтобы брокер нашел повторяющиеся URL'ы. Когда
находятся два объекта с одинаковыми URL'ами, объект с наибольшей
временной меткой удаляется.
</descrip>

<sect2>Удаление нежелательных объектов брокера

<p>
Если вы построите брокер, а потом решите не индексировать некоторые данные (например,
если вы решите разделить данные для индексирования двумя разными брокерами), вам нужно изменить
конфигурационный файл Gatherer'а, перезапустить Gatherer, а потом позволить старым объектам устареть
в брокере (так как брокер и Gatherer содержат отдельные базы данных). Если вы
хотите вычистить данные брокера быстрее, вы можете использовать административный интерфейс брокера
одним из трех способов:

<enum>
<item>Использовать команду 'удалить объекты по имени'. Это разумно только, если
у вас небольшое число объектов, которые надо удалить.
<item>Использовать 'удалить объекты по запросу'. Это может оказаться лучшей опцией, если,
например, вы можете построить регулярное выражение для тех URL'ов, которые вы хотите
удалить.
<item>Остановить сервер, вручную удалить файлы брокера <em>objects/*</em>,
а потом перезапустить брокер. Это самы простой способ, хотя если у вас
большое число объектов, то для перестроения индекса потребуется много времени. Простой способ
выполнить это -- перезапустить брокер, удалить все текущие объекты и сделать полную коллекцию:

      <tscreen><verb>
        % mv objects objects.old
        % rm -rf objects.old &amp;
        % broker ./admin/broker.conf -new
      </verb></tscreen>

</enum>

После удаления объектов, вам следует использовать команду <em>индексировать все</em>.

<sect2>Администрирование из командной строки

<p>
Можно предоставить административные функции, используя
программу <tt>brkclient</tt> из командной строки и скриптов оболочки.
Например, чтобы выполнить собирание (collection), запустите:

<tscreen><verb>
        % brkclient localhost 8501 '#ADMIN #Password secret #collection'
</verb></tscreen>

Посмотрите файл <em>admin.html</em> вашего брокера, если хотите увидеть полный список
административных команд.

<sect1>Настройка индексирования Glimpse в Broker'е
<label id="Tuning Glimpse indexing in the Broker">

<p>
Система индексирования Glimpse может быть настроена различными способами, чтобы
удовлетворить вашим конкретным нуждам. Наверное, больше всего внимания заслуживает
параметр ``степень детализации индексирования'' (indexing granularity), для которго Glimpse
предоставляет три опции: крохотный индекс (2-3% всего
размера всех файлов), маленький индекс (7-8%) и
средний индекс (20-30%). Времена поиска лучше с большими индексами.
Изменяя опцию <bf>GlimpseIndex-Option</bf> в файле <em>broker.conf</em>
вашего брокера, вы можете настроить Glimpse для использования одной из трех
опций детализации индекса. По умолчанию, <bf>GlimpseIndex-Option</bf> строит средний индекс,
используя программу <tt>glimpseindex</tt>.

Заметьте также, что при помощи Glimpse поиск осуществляется быстрее, если выключить ``показывать
совпавшие строки'' на странице запросов брокеру.

Glimpse использует ``stop-list'', чтобы избежать индексирование очень распространенных слов.
Этот список не фиксирован, он получается при построении индекса. По умолчанию
для среднего индекса каждое слово, которое встречается по крайней мере 500 раз в 1 Mb
(в среднем), помещается в stop-list. Для маленького индекса по умолчанию в stop-list
помещаются слова, которые появляются в 80% всех файлов (если файло не меньше 256,
иначе stop-list не создается). Установки по умолчанию можно изменить, используя
опцию <bf>-S</bf>, за которой должно стоять новое чисол (среднее в 1 Mb при
использовании индексирования <bf>-b</bf>, или % от файлов при использовании индексирования <bf>-o</bf>).
Крошечные индексы не содержат stop-list'ов (их влияние минимально).

<tt>glimpseindex</tt> включает несколько других опций, которые могут быть
интересными. Вы можете больше узнать об этих опциях (и о Glimpse в
общем) в <htmlurl url="http://webglimpse.org/gdocs.html" name="документации Glimpse">.
Если вы захотите изменить то, как брокер вызывает программу
<tt>glimpseindex</tt>, то отредактируйте файл
<em>src/broker/Glimpse/index.c</em> в исходниках дистрибутива Harvest'а.

<sect2>Программа glimpseserver

<p>
Система Glimpse поставляется со вспомогательным сервером, называемым
<tt>glimpseserver</tt>, который позволяет считывать индексы в процесс и хранить
в памяти. Это помогает избежать добавочной стоимости чтения индекса и запуска
больших процессов для каждого поиска. <tt>glimpseserver</tt> автоматически
запускается каждый раз, когда вы запускаете брокер, или заново все индексируете. Если вы
не хотите запускать <tt>glimpseserver</tt>, тогда установите <bf>GlimpseServer-Host</bf>
в ``false'' в вашем <em>broker.conf</em>.

<sect1>Использование различных индексирующих/поисковых систем вместе с Broker'ом
<label id="Using different index/search engines with the Broker">

<p>
По умолчанию Harvest использует подсистему индекса/поиска Glimpse. Однако Harvest
определяет гибкий интерфейс индексирования, что позволяет администраторам брокера использовать
разные индексирующие/поисковые подсистемы и удовлетворять требованиям, особенным для данного домена.
Например, может оказаться полезным снабдить реляционную базу данных сервером.

На данный момент мы распространяем код с поддержкой интерфейса как свободного,
так и коммерческого движков WAIS, Glimpse и Swish.

Ниже мы обсуждаем, как использовать другие движки индекса/поиска вместо Glimpse в
брокере, и коротко обсуждаем, как объединить новый движок индекса/поиска с брокером.

<sect2>Использование Swish в качестве индексера

<p>
Harvest включает поддержку для испльзования Swish, как индексирующего движка, с брокером.
Swish -- это хорошая альтернатива Glimpse, если вас нужна поддержка более быстрого поиска, и
вы не желаете использовать более мощные свойства запросов. Также это иногда альтернатива,
если есть проблемы со статусом прав использования Glimpse.

Чтобы использовать Swish с существующим брокером, вам нужно изменить переменную
<em>Indexer-Type</em> в <EM>broker.conf</EM> на ``Swish''.

Вы также можете указать, что вы хотите использовать Swish для брокера, когда используете
команду <tt>RunHarvest</tt>, запустив: <tt>RunHarvest -swish</tt>.

<sect2>Использование WAIS в качестве индексера

<p>
Поддержка использования WAIS (как freeWAIS, так и WAIS Inc.) как
подсистем брокера индексирования и поиска включена в дистрибутив Harvest.
WAIS -- это хорошая альтернатива Glimpse, если вас нужна поддержка более быстрого поиска, и
вы не желаете использовать более мощные свойства запросов.

Чтобы использовать WAIS с существующим брокером, вам нужно изменить переменную
<em>Indexer-Type</em> в <em>broker.conf</em> на ``WAIS''; вы можете
выбрать вариант WAIS, установив переменную <em>WAIS-Flavor</em> в
<em>broker.conf</em> на ``Commercial-WAIS'', ``freeWAIS'' или ``WAIS''.
Иначе <tt>CreateBroker</tt> спросит вас, хотите ли вы использовать WAIS и
где находятся программы WAIS (<tt>waisindex</tt>, <tt>waissearch</tt>,
<tt>waisserver</tt> и, в коммерческой версии WAIS,
<tt>waisparse</tt>). Когда вы запустите брокер, после построения индекса
автоматически запустится сервер WAIS.

Вы также можете указать, что хотите использовать WAIS для брокера, когда используете
команду <tt>RunHarvest</tt>, запустив: <tt>RunHarvest -wais</tt>.

<sect1>Описание интерфейса коллектора: Collection.conf
<label id="Collector interface description: Collection.conf">

<p>
Брокер получает индексную информацию от Gatherer'ов или других брокеров
через свой интерфейс <em>Collector</em>. Список точек коллекционирования
указан в конфигурационном файле <em>admin/Collection.conf</em>. Этот файл
содержит точки коллекционирования в каждой строке из 4 полей. Первое поле --
хост удаленного Gatherer'а или брокера, второе поле -- номер порта на этом хосте,
третье поле -- тип кооекции, а четвертое поле -- фильтр
запросов или <bf>--</bf>, если фильтра нет.

Брокер поддерживает различные типы коллекций, которые приведены ниже:

<tscreen><verb>
  Тип   Удаленный процесс     Описание                      Сжатие?
  ---------------------------------------------------------------------
    0     Gatherer    Полное коллекционирование всякий раз  Нет
    1     Gatherer    Инкрементальное коллекционирование    Нет
    2     Gatherer    Полное коллекционирование всякий раз  Да
    3     Gatherer    Инкрементальное коллекционирование    Да
    4     Broker      Полное коллекционирование всякий раз  Нет
    5     Broker      Инкрементальное коллекционирование    Нет
    6     Broker      Коллекционированное на основе запроса Нет
    7     Broker      Инкрементальное на основе запроса     Нет
</verb></tscreen>

Спецификация фильтра запроса для типов коллекций 6 и 7 содержит две
части: <bf>--QUERY keywords</bf> и опционально <bf>--FLAGS flags</bf>.
Часть <bf>--QUERY</bf> передается брокеру как ключевые слова для хапроса
(ключевые слова могут быть любым булевским и/или структурированным запросом);
часть <bf>--FLAGS</bf> передается брокеру как флаги запросу, в зависимости от индексера.
Следующая таблица показывает действующие флаги для поддерживаемых индексеров:

<tscreen><verb>
Индексер        Флаг                            Описание
-----------------------------------------------------------------------------
All:            #desc                           показать строки описания

Glimpse:        #index case insensitive         без учета регистра
                #index case sensitive           с учетом регистра
                #index error number             допустимо число &quot;number&quot; ошибок
                #index matchword                поиск по границам слов
                #index maxresult number         максимальное число результатов &quot;number&quot;
                #opaque                         показать совпавшие строки

Wais:           #index maxresult number         максимальное число результатов &quot;number&quot;
                #opaque                         показать оценки и ранжирования
</verb></tscreen>

Ниже приведен пример <em>Collection.conf</em>, который собирает информацию
с 2 Gatherer'ов (один -- сжатое инкрементальное коллекционирование, а другой --
несжатое полное) и с 3 брокеров (один --
инкрементальное на основе временной метки, а другие -- с использованием фильтров запросов):

<tscreen><verb>
        gatherer-host1.foo.com 8500 3 --
        gatherer-host2.foo.com 8500 0 --
        broker-host1.foo.com   8501 5 --
        broker-host2.foo.com   8501 6 --QUERY (URL : document) AND gnu
        broker-host3.foo.com   8501 7 --QUERY Harvest --FLAGS #index case sensitive
</verb></tscreen>

<sect1>Устранение неполадок

<p>
<descrip>
<tag/Симптом/
Брокер запущен, но всегда возвращает <em>empty query results (пустой результат на запрос)</em>.

<tag/Решение/
Посмотрите в файле broker.out в каталоге брокера
на сообщения об ошибках. Если ваш брокер не проиндексировал данные, используйте
административный интерфейс, чтобы заставить брокер построить индекс (см. раздел
<ref id="Administrating a Broker"
name="Администрирование брокера">.

<tag/Симптом/
Когда я отправляю запрос брокеру, я получаю &quot;500 Server Error&quot; (ошибка сервера 500).

<tag/Решение/
В основном, ошибки ``500'' относятся к неверно работающим программам CGI
или неверно сконфигурированному серверу httpd. Убедитесь, что userid пользователя, запустившего
сервер HTTP имеет доступ к каталогу Harvest'а cgi-bin и файлам Perl
в <em>$HARVEST_HOME/lib</em>. Обратитесь в раздел
<ref id="Additional installation for the Harvest Broker"
name="Дополнительная установка для Harvest Broker">
за деталями.

<tag/Симптом/
Я вижу <em>продублированные документы</em> в моем брокере.

<tag/Решение/
Брокер предоставляет устранение дубликатов на основе комбинации контрольных сумм MD5
и хоста, имени, версии Gatherer'а. Таким образм, вы можете убрать
продублированные документы, если ваш брокер собирает с более чем одного Gatherer'а, каждый
из которых собирает с одного набора URL. (Как отступление, причина
этого замечания о устранении дубликатов связана с тем, что отдельный брокер может
содержать несколько различных объектов SOIF для одного URL, но просуммированных
различными способами.)

Есть два решения проблемы:

<enum>
<item>Запустите ваши Gatherer'ы на одном хосте.
<item>Удалите продублированные URL'ы в настроенной версии программы
      <tt>search.cgi</tt>, проделав построчное сравнение URL.
</enum>

<tag/Симптом/
Брокер долго работает и не отвечает на запросы.

<tag/Решение/
Некоторые запросы очень тяжелые, так как вовлекают много работы с вводом/выводом.
По этой причине мы модифицировали Broker, так что если запрос занимает больше чем 5
минут, процесс запроса убивается. Лучшее решение -- использовать менее тяжелые
запросы, например, используя меньше распространенных ключевых слов.

<tag/Симптом/
Некоторые из <em>опций запросов</em> (такие как структурированные запросы или запросы
с учетом регистра) <em>не работают</em>.

<tag/Решение/
Обычно это означает, что вы используете движок индекса/поиска, который не поддерживает
структурированных запросов. Если вы устанавливаете свой брокер (а не используете чей-то еще),
обратитесь в раздел
<ref id="Using different index/search engines with the Broker"
name="Использование различных индексирующих/поисковых систем вместе с Broker'ом">
за деталями о том, как
переключиться на другие движки. Или может быть ваша
программа <tt>search.cgi</tt> старой версии и должна быть обновлена.

<tag/Симптом/
Я получаю <em>syntax errors</em> (ошибки синтаксиса), когда посылаю запрос.

<tag/Решение/
Обычно это значит, что вы не испотзовали двойные кавычки, где необходимо. См. раздел
<ref id="Querying a Broker"
name="Отправление запросов Broker'у">.

<tag/Симптом/
Когда я посылаю запрос, я получаю ответ <em>быстрее, чем, как я думаю,</em>
нужно потратить на обработку запроса, и ответ содержит <em>данные с мусором</em>.

<tag/Решение/
Вероятно, это указывает, что ваш <tt>httpd</tt> плохо сконфигурирован.
Обычно не ставят 'ScriptAlias' перед 'Alias' в файле
<em>conf/httpd.conf</em>, когда запускают Apache <tt>httpd</tt>. См. раздел
<ref id="Additional installation for the Harvest Broker"
name="Дополнительная установка для Harvest Broker">.

<tag/Симптом/
Когда я делаю <em>изменения</em> в конфигурационном файле брокера при помощи
<em>административного интерфейса</em>, они <em>теряются</em> после перезапуска брокера.
is restarted.

<tag/Решение/
Административный интерфейс брокера не сохраняет изменений при перезапуске.
Постоянные изменения в конфигурации брокера следует делать в файле
<em>broker.conf</em>.

<tag/Симптом/
Мой брокер <em>работает очень медленно</em>.

<tag/Решение/
Настройка производительности может быть сложна, но скорее всего проблема
в том, что вы запускаете брокер на машине с недостаточным количеством RAM,
и много записываете в своп, так как движок запросов выбрасывает страницы памяти,
чтобы получить доступ к необходимому индексу и файлам с данными.
(В UNIX буферный кэш диска борется с программными страницами  и страницами даных за
память.)

Простой способ проверить -- запустить ``vmstat 5'' в одном окне, и после
пары строк вывода, выполнить запрос из другого окна. Так напечатается
строка с измерениями статуса виртуальной памяти вашей машины каждые 5
секунд. В частности, посмотрите на колонки ``pi'' и ``po''. Если числа
вдруг прыгнут в диапазон 500-1000 после выполнения запроса, значит вы
много записываете страниц памяти.

Заметьте, что проблемы со страницами обостряются при одновременном запуске
программ с интенсивным вводом/выводом в память или на диск. Одновременные
запросы одному брокеру не должны вызывать проблем со страницами, так как
брокер обрабатывает запросы последовательно.

Лучше всего запускать брокер на почти не используемой машине с
памятью, по меньшей мере, 128 MB (лучше больше, если вышеуказанный эксперимент с ``vmstat''
показывает, что вы записывает много страниц).

Другой способ улучшить производительность - запустить <em>httpd-accelerator</em> на
машине с вашим брокером, чтобы перехватывать запросы брокеру. Пока он
заносит в кэш результат запросов, он снизит загрузку машины, так как
он снабжен очень эффективными средствами возвращения запросов в случае
пааллельных запросов. Без акселератора результаты возвращаются процессами
<tt>search.cgi</tt> на каждый запрос, а ядро UNIX неэффективно делит время
для этих процессов. С акселератором процессы <tt>search.cgi</tt> быстро
умирают и дают акселератору вернуть результаты разным пользователям одновременно.
Акселератор также снизит нагрузку для получения данных (не запросов) с вашего
сервера httpd.
</descrip>

<sect>Программы и размещение установленного ПО Harvest
<label id="Programs and layout of the installed Harvest software">

<p>

<sect1>$HARVEST_HOME

<p>
Верхний каталог, в который вы установили Harvest, обозначим
<em>$HARVEST_HOME</em>. По умолчанию <em>$HARVEST_HOME</em> -- это
<em>/usr/local/harvest</em>. В <em>$HARVEST_HOME</em> находятся следующие файлы и каталоги:

<tscreen><verb>
        RunHarvest*         brokers/            gatherers/          tmp/
        bin/                cgi-bin/            lib/
</verb></tscreen>

<tt>RunHarvest</tt> -- это скрипт, используемый для создания и запуска серверов Harvest
(см. раздел
<ref id="Starting up the system: RunHarvest and related commands"
name="Запуск системы: команда RunHarvest и связанные с ней команды">.
<tt>RunHarvest</tt> имеет
такой же синтаксис командной строки, что и <tt>Harvest</tt>.

<sect1>$HARVEST_HOME/bin

<p>
Каталог <em>$HARVEST_HOME/bin</em> содержит только те программы, которые пользователи
обычно могут сразу запустить. Все другие программы (например, отдельные summarizer'ы
для Gatherer'а) так же, как и библиотечный код Perl находятмя в каталоге <em>lib</em>.
Каталог <em>bin</em> содержит следующие программы:

<descrip>
<tag><tt>CreateBroker</tt></tag>
Создает брокер.

Использование: <tt>CreateBroker [skeleton-tree [destination]]</tt>

<tag><tt>Gatherer</tt></tag>
Главный пользовательский интерфейс Gatherer'а. Эта программа запускается
скриптом <tt>RunGatherer</tt>, который находится в каталоге Gatherer'а.

Использование: <tt>Gatherer [-manual|-export|-debug] file.cf</tt>

<tag><tt>Harvest</tt></tag>
Эта программа используется <tt>RunHarvest</tt> для создания и запуска серверов Harvest
согласно описанию пользователя.

Использование: <tt>Harvest [flags]</tt>

Где флаги (flags) могут быть следующие:

<tscreen><verb>
        -novice         Простейшая форма вопрос-ответ. В основном использует установки по умолчанию.
        -glimpse        Использовать Glimpse для брокера. (по умолчанию)
        -swish          Использовать Swish для брокера.
        -wais           Использовать WAIS для брокера.
        -dumbtty        Немой режим TTY.
        -debug          Режим отладки.
        -dont-run       Не запускать брокер и Gatherer.
        -fake           Не строить сервера Harvest.
        -protect        Не менять umask.
</verb></tscreen>

<tag><tt>broker</tt></tag>
Программа Broker. Эта программа запускается скриптом <tt>RunBroker</tt>,
который находится в каталоге брокера. Записывает лог-сообщения как в
<em>broker.out</em>, так и в <em>admin/LOG</em>.

Использование: <tt>broker [broker.conf file] [-nocol]</tt>

<tag><tt>gather</tt></tag>
Клиентский интерфейс Gatherer'а.

Использование: <tt>gather [-info] [-nocompress] host port [timestamp]</tt>
</descrip>

<sect1>$HARVEST_HOME/brokers

<p>
Каталог <em>$HARVEST_HOME/brokers</em> содержит картинки и логотипы в
каталоге <em>images</em>, некоторые основные учебные HTML страницы и файлы-скелеты,
которые использует <tt>CreateBroker</tt> для построения новых брокеров. Вы можете
изменить значения по умолчанию в этих создаваемых брокерах, отредактировав файлы в
<em>skeleton</em>.

<sect1>$HARVEST_HOME/cgi-bin

<p>
Каталог <em>$HARVEST_HOME/cgi-bin</em> содержит программы, необходимые для
WWW интерфейса брокера (описанного в разделе
<ref id="CGI programs"
name="Программы CGI">) и конфигурационные
файлы для <tt>search.cgi</tt> в каталоге <em>lib</em>.

<sect1>$HARVEST_HOME/gatherers

<p>
Каталог <em>$HARVEST_HOME/gatherers</em> содержит примеры Gatherer,
обсуждаемые в разделе
<ref id="Gatherer Examples"
name="Примеры Gatherer'ов">.
<tt>RunHarvest</tt> по умолчанию создаст новый Gatherer
в этом каталоге.

<sect1>$HARVEST_HOME/lib

<p>
Каталог <em>$HARVEST_HOME/lib</em> содержит много функций библиотеки Perl
и другие программы, необходимые различным частям Harvest'а, например, следующие:

<descrip>
<tag><em>chat2.pl, ftp.pl, socket.ph</em></tag>
Библиотеки Perl, используемые для соединения с удаленными серверами FTP.

<tag><em>dateconv.pl, lsparse.pl, timelocal.pl</em></tag>
Библиотеки Perl, используемые для разбора выхода <tt>ls</tt>.

<tag><tt>ftpget</tt></tag>
Программа, используемая для получения файлов и каталогов с серверов FTP.

Использование: <tt>ftpget [-htmlify] localfile hostname filename A,I username password</tt>

<tag><tt>gopherget.pl</tt></tag>
Программа Perl для получения файлов и меню с серверов Gopher.

Использование: <tt>gopherget.pl localfile hostname port command</tt>

<tag><tt>harvest-check.pl</tt></tag>
Программа Perl для проверки, запущены ли брокеры и gatherer'ы.

Использование: <tt>harvest-check.pl [-v]</tt>

<tag><tt>md5</tt></tag>
Программа для вычисления контрольных сумм MD5.

Использование: <tt>md5 file [...]</tt>

<tag><tt>newsget.pl</tt></tag>
Программа Perl для получения статей и резюме групп USENET с серверов NNTP.

Использование: <tt>newsget.pl localfile news-URL</tt>

<tag><em>soif.pl, soif-mem-efficient.pl</em></tag>
Библиотека Perl для обработки SOIF.

<tag><tt>urlget</tt></tag>
Программа для извлечения  данных с URL.

Использование: <tt>urlget URL</tt>

<tag><tt>urlpurge</tt></tag>
Программа чистки локального URL кэша, используемая <tt>urlget</tt> и
Gatherer'ом.

Использование: <tt>urlpurge</tt>
</descrip>

<sect1>$HARVEST_HOME/lib/broker

<p>
Каталог <em>$HARVEST_HOME/lib/broker</em> содержит поисковые и индексные программы,
необходимые брокеру, а также несколько утилит для администрирования брокера:

<descrip>
<tag><tt>BrokerRestart</tt></tag>
Эта программа выполнит команду перезапуска брокера.

Использование: <tt>BrokerRestart [-password passwd] host port</tt>

<tag><tt>brkclient</tt></tag>
Клиентский интерфейс брокера. Может быть использован для отправления запросов
или административных команд брокеру.

Использование: <tt>brkclient hostname port command-string</tt>

<tag><tt>dumpregistry</tt></tag>
Печатает файл-реестр брокера в удобном для чтения формате.

Использование: <tt>dumpregistry [-count] [BrokerDirectory]</tt>

<tag><tt>agrep, glimpse, glimpseindex, glimpseserver</tt></tag>
Система индекса и поиска Glimpse, описанная в разделе
<ref id="The Broker" name="Broker">.

<tag><tt>swish</tt></tag>
Программа индекса и поиска Swish как альтернатива Glimpse.

<tag><tt>info-to-html.pl, mkbrokerstats.pl</tt></tag>
Программы Perl для генерирования статистики брокера и создания
<em>stats.html</em>.

Использование: <tt>gather -info host port | info-to-html.pl &gt; host.port.html</tt>

Использование: <tt>mkbrokerstats.pl broker-dir &gt; stats.html</tt>
</descrip>

<sect1>$HARVEST_HOME/lib/gatherer

<p>
Каталог <em>$HARVEST_HOME/lib/gatherer</em> содержит
summarizer'ы, описанные в разделе
<ref id="Extracting data for indexing: The Essence summarizing subsystem"
name="Получение данных для индексации: подсистема суммирования Essence">,
а также различные утилиты,
необходимые summarizer'ам и Gatherer'у, как например:

<descrip>
<tag><em>URL-filter-default</em></tag>
Фильтр URL по умолчанию, описанный в разделе
<ref id="RootNode specifications" name="Описание RootNode">.

<tag><em>bycontent.cf, byname.cf, byurl.cf, magic, stoplist.cf, quick-sum.cf</em></tag>
Конфигурационные файлы Essence, описанные в разделе
<ref id="Customizing the type recognition, candidate selection,
presentation unnesting, and summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">.

<tag><tt>*.sum</tt></tag>
Summarizer'ы Essence, описанные в разделе
<ref id="Extracting data
for indexing: The Essence summarizing subsystem"
name="Получение данных для индексации: подсистема суммирования Essence">.

<tag><tt>HTML-sum.pl</tt></tag>
Альтернативные HTML summarizer'ы, написанные на Perl.

<tag><tt>HTMLurls</tt></tag>
Программы для извлечения URL'ов из файлов HTML.

Использование: <tt>HTMLurls [--base-url url] filename</tt>

<tag><tt>catdoc, xls2csv,</tt> <em>catdoc-lib</em></tag>
Программы и файлы, используемые summarizer'ом Microsoft Word.

<tag><tt>dvi2tty, print-c-comments, ps2txt, ps2txt-2.1, pstext,
     skim</tt></tag>
Программы, используемы разными summarizer'ами.

<tag><tt>gifinfo</tt></tag>
Программа для поддержки summarizer'ов.

<tag><tt>l2h</tt></tag>
Программа, используемая summarizer'ом TeX.

<tag><tt>rast, smgls, sgmlsasp,</tt> <em>sgmls-lib</em></tag>
Программы и файлы для SGML summarizer'а.

<tag><tt>rtf2html</tt></tag>
Программа для RTF summarizer'а.

<tag><tt>wp2x, wp2x.sh,</tt> <em>wp2x-lib</em></tag>
Программы и файлы для WordPerfect summarizer'а.

<tag><tt>hexbin, unshar, uudecode</tt></tag>
Программы для извлечения упакованных объектов.

<tag><tt>cksoif</tt></tag>
Программы для проверки точности потока SOIF (например, чтобы убедиться, что
нет ошибок разбора).

Использование: <tt>cksoif &lt; INPUT.soif</tt>

<tag><tt>cleandb, consoldb, expiredb, folddb, mergedb,
     mkgathererstats.pl, mkindex, rmbinary</tt></tag>
Программы для подготовки базы данных Gatherer'а для экспорта при помощи
<tt>gatherd</tt>.

<tt>cleandb</tt> удостоверяется в том, что все объекты SOIF не содержат ошибок,
и удалaет все объекты с ошибками;

<tt>consoldb</tt> объединяет n файлов баз данных GDBM в один файл;

<tt>expiredb</tt> удаляет все объекты SOIF, которые устарели согласно атрибту
<em>Time-to-Live</em> (время жизни);

<tt>folddb</tt> проделывает все необходимые операции, необходимые для подготовки
базы данных Gatherer'а к экспорту при помощи <tt>gatherd</tt>;

<tt>mergedb</tt> объединяет файлы GDBM, как описано в разделе
<ref id="Incorporating manually generated information into a Gatherer"
name="Включение в Gatherer информации, сгенерированной вручную">;

<tt>mkgathererstats.pl</tt> генерирует файл статистики <em>INFO.soif</em>

<tt>mkindex</tt> генерирует кэш временных меток;

<tt>rmbinary</tt> удаляет двоичные данные из базы данных GDBM.

<tag><tt>enum, prepurls, staturl</tt></tag>
Программы, используемые <tt>Gatherer'ом</tt> для нумерации RootNode и LeafNode,
как описано в разделе
<ref id="RootNode specifications"
name="Описание RootNode">.

<tt>enum</tt> выполняет нумерацию RootNode данных URL'ов;

<tt>prepurls</tt> -- программа-упаковщик для взаимодействия
<tt>Gatherer'а</tt> и <tt>essence</tt>;

<tt>staturl</tt> получает LeafNode URL и определяет изменился URL или
нет.

<tag><tt>fileenum, ftpenum, ftpenum.pl, gopherenum-*, httpenum-*,
     newsenum</tt></tag>
Программы, используемые <tt>enum</tt>, чтобы выполнять нумерацию в зависимости от протокола.

<tt>fileenum</tt> выполняет нумерацию RootNode для URL'ов типа ``file'';

<tt>ftpenum</tt> вызывает <tt>ftpenum.pl</tt> для выполнения нумерации RootNode
URL'ов по ``ftp'';

<tt>gopherenum-breadth</tt> выполняет широкую нумерацию RootNode
для URL'ов типа ``gopher'';

<tt>gopherenum-depth</tt> выполняет глубокую нумерацию RootNode
для URL'ов типа ``gopher'';

<tt>httpenum-breadth</tt> выполняет широкую нумерацию RootNode для URL'ов типа ``http'';

<tt>httpenum-depth</tt> выполняет глубокую нумерацию RootNode для URL'ов типа ``http'';

<tt>newsenum</tt> выполняет нумерацию RootNode для ``news'' URL'ов;

<tag><tt>essence</tt></tag>
Система извлечения содержимого Essence, описанная в разделе
<ref id="Customizing the type recognition, candidate selection,
presentation unnesting, and summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">.

Использование: <tt>essence [options] -f input-URLs</tt>
или <tt>essence [options] URL ...</tt>

где опции (options):

<tscreen><verb>
        --dbdir directory       Каталог для размещения базы данных
        --full-text             Использовать весь файл вместо суммирования
        --gatherer-host         Хост Gatherer'а
        --gatherer-name         Имя Gatherer'а
        --gatherer-version      Версия Gatherer'а
        --help                  Выдает информацию об использовании
        --libdir directory      Каталог для размещения конфигурационных файлов
        --log logfile           Имя файла для лог-сообщений
        --max-deletions n       Число удалений GDBM перед реорганизацией
        --minimal-bookkeeping   Генерирует минимальное число атрибутов учета ресурсов
        --no-access             Не читать содержимое объектов
        --no-keywords           Не генерировать автоматически ключевые слова
        --allowlist filename    Файл со списком допустимых типов
        --stoplist filename     Файл со списком типов, которые нужно удалять
        --tmpdir directory      Имя каталога для временных файлов
        --type-only             Только выдавать данные, не суммировать объекты
        --verbose               Более полный вывод
        --version               Информация о версии
</verb></tscreen>

<tag><tt>print-attr</tt></tag>
Читает поток SOIF из stdin и печатает данные, связанные с данным атрибутом, на
stdout.

Использование: <tt>cat SOIF-file | print-attr Attribute</tt>

<tag><tt>gatherd, in.gatherd</tt></tag>
Демоны, которые экспортируют базу данных Gatherer'а. <tt>in.gatherd</tt>
используется для запуска этого демона из inetd.

Использование:
<tt>gatherd    [-db | -index | -log | -zip | -cf file] [-dir dir] port</tt>

Использование:
<tt>in.gatherd [-db | -index | -log | -zip | -cf file] [-dir dir]</tt>

<tag><tt>gdbmutil</tt></tag>
Программа для выполнения различных действий над базой данных GDBM.

<tscreen><verb>
Использование: gdbmutil consolidate [-d | -D] master-file file [file ...]
Использование: gdbmutil delete file key
Использование: gdbmutil dump file
Использование: gdbmutil fetch file key
Использование: gdbmutil keys file
Использование: gdbmutil print [-gatherd] file
Использование: gdbmutil reorganize file
Использование: gdbmutil restore file
Использование: gdbmutil sort file
Использование: gdbmutil stats file
Использование: gdbmutil store file key &lt; data
</verb></tscreen>

<tag><tt>mktemplate</tt></tag>
Программа для генерирования правильных SOIF на основе более простого редактируемого
формата, подобногоSOIF (например, SOIF без подсчета байтов).

Использование: <tt>mktemplate &lt; INPUT.txt &gt; OUTPUT.soif</tt>

<tag><tt>quick-sum</tt></tag>
Простоая программа Perl для эмулирования обработки <em>quick-sum.cf</em> Essence
для тех, кто не может откомпилировать Essence с соответствующим кодом на C.

<tag><tt>template2db</tt></tag>
Конвертирует поток объетов SOIF (из stdin или данных файлов) в базу данных GDBM.

Использование: <tt>template2db database [tmpl tmpl...]</tt>

<tag><tt>wrapit</tt></tag>
Преобразует данные из stdin в пары SOIF атрибут-значение с подсчетом байт.
Используется summarizer'ами Essence и легко гнерирует SOIf.

Использование: <tt>wrapit [Attribute]</tt>

<tag><tt>kill-gatherd</tt></tag>
Скрипт для убивания процесса gatherd.
</descrip>

<sect1>$HARVEST_HOME/tmp

<p>
Каталог <em>$HARVEST_HOME/tmp</em> используется search.cgi для хранения
страниц результатов поиска.

<sect>Формат взаимообмена краткими изложениями документов (SOIF)
<label id="The Summary Object Interchange Format (SOIF)">

<p>
Gatherer'ы и Broker'ы Harvest взаимодействуют используя протокол потока пар атрибут-значение,
который называется форматом взаимообмена краткими изложениями документов
(<em>Summary Object Interchange Format, SOIF)</em>, пример
которого есть в разделе
<ref id="Example 1"
name="Пример 1">.
Gatherer'ы генерируют резюме содержимого для отдельных объектов в формате SOIF и
предоставляют эти резюме брокерам, которые хотят их собрать и проиндексировать. SOIF
предоставляет средства для передачи резюме содержимого объектов брокерам от
Gatherer'а в формате SOIF для многих объектов в одном, эффективном сжатом потоке.
Брокеры Harvest имеют поддержку для выполнения запросов
к данным SOIF, используя структурированные запросы вида атрибут-значение и много других типов запросов,
что обсуждается в разделе
<ref id="Querying a Broker"
name="Отправление запросов Broker'у">.

<sect1>Формальное описание SOIF

<p>
Грмматика SOIF следующая:

<tscreen><verb>
    SOIF            ::=  OBJECT SOIF | OBJECT
    OBJECT          ::=  @ TEMPLATE-TYPE { URL ATTRIBUTE-LIST }
    ATTRIBUTE-LIST  ::=  ATTRIBUTE ATTRIBUTE-LIST | ATTRIBUTE
    ATTRIBUTE       ::=  IDENTIFIER {VALUE-SIZE} DELIMITER VALUE
    TEMPLATE-TYPE   ::=  Alpha-Numeric-String
    IDENTIFIER      ::=  Alpha-Numeric-String
    VALUE           ::=  Arbitrary-Data
    VALUE-SIZE      ::=  Number
    DELIMITER       ::=  &quot;:&lt;tab&gt;&quot;
</verb></tscreen>

<sect1>Список общих имен атрибутов SOIF
<label id="List of common SOIF attribute names">

<p>
Каждый брокер может поддерживать различные атрибуты, в зависимости от данных, которые он хранит.
Ниже мв приводим список наиболее общих атрибутов:

<tscreen><verb>
Abstract
     Краткий обзор объекта.
Author
     Автор(ы) объекта.
Description
     Краткое описание объекта.
File-Size
     Число байт в объекте.
Full-Text
     Все содержимое объекта.
Gatherer-Host
     Хост, на котором Gatherer запущен для извлечения информации об объекте.
Gatherer-Name
     Имя Gatherer'а, который извлекает информацию об объекте. (например,
     Full-Text (весь текст), Selected-Text (выбранный текст) или Terse (сжатый)).
Gatherer-Port
     Номер порта на хосте Gatherer'а, который обслуживает информацию Gatherer'а.
Gatherer-Version
     Номер версии Gatherer'а.
Update-Time
     Время, когда Gatherer обновлял резюме содержимого объекта.
     ТРЕБУЕМОЕ поле. Нет значения по умолчанию.
Keywords
     Ключевые слова для поиска, извлеченные из объекта.
Last-Modification-Time
     Время, когда объект был модифицирован последний раз.
MD5
     16-байтная контрольная сумма MD5 объекта.
Refresh-Rate
     Число секунд после времени Update-Time, по истечнии которых резюме объекта должно быть
     регенерировано.  По умолчанию -- 1 месяц.
Time-to-Live
     Число секунд после времени Update-Time, по исечении которых резюме объекта больше
     не действительно. По умолчанию -- 6 месяцев.
Title
     Заголовок объекта.
Type
     Тип объекта. Ниже приведены некоторые примеры типов:

             Archive
             Audio
             Awk
             Backup
             Binary
             C
             CHeader
             Command
             Compressed
             CompressedTar
             Configuration
             Data
             Directory
             DotFile
             Dvi
             FAQ
             FYI
             Font
             FormattedText
             GDBM
             GNUCompressed
             GNUCompressedTar
             HTML
             Image
             Internet-Draft
             MacCompressed
             Mail
             Makefile
             ManPage
             Object
             OtherCode
             PCCompressed
             Patch
             Pdf
             Perl
             PostScript
             RCS
             README
             RFC
             RTF
             SCCS
             ShellArchive
             Tar
             Tcl
             Tex
             Text
             Troff
             Uuencoded
             WaisSource

URI
     Uniform Resource Identifier - универсальный идентификатор ресурса.
URL-References
     Любые ссылки URL, присутствующие в объектах HTML.
</verb></tscreen>

<sect>Примеры Gatherer
<label id="Gatherer Examples">

<p>
Следующие примеры устанавливаются в <em>$HARVEST_HOME/gatherers</em> по
умолчанию (см. раздел
<ref id="Installing the Harvest Software"
name="Установка ПО Harvest">).

Дистрибутив Harvest содержит несколько примеров того, как конфигурировать,
настраивать и запусктаь Gatherer'ы. Это раздел проведет вас через некоторые примеры
Gatherer'ов. Цель -- дать вам почувствовать, что вы можете делать с Gatherer'ом
и как это делать. Вам не обязательно прорабатывать все эти примеры; каждый из
них поучителен по-своему.

Чтобы использовать примеры Gatherer'ов, вам нужно определить каталог bin Harvest'а
в вашей переменной пути, и определить <em>HARVEST_HOME</em>. Например:

<tscreen><verb>
        % setenv HARVEST_HOME /usr/local/harvest
        % set path = ($HARVEST_HOME/bin $path)
</verb></tscreen>

<sect1>Пример 1 - простой Gatherer
<label id="Example 1">

<p>
Этот пример -- это простой Gatherer, который использует установки по умолчанию.
Единственное, что нужно сделать пользователю для работы с этим Gatherer'ом -- это указать
список URL'ов, из которых собирать данные (см. раздел
<ref id="The Gatherer"
name="Gatherer">).

Чтобы запустить этот пример, наберите:

<tscreen><verb>
        % cd $HARVEST_HOME/gatherers/example-1
        % ./RunGatherer
</verb></tscreen>

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите
<em>example-1.cf</em>. Первые несколько строчек -- это переменные, которые указывают некоторую
локальную информацию о Gatherer'е (см. раздел
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">).
Например, каждое
резюме содержимого будет содержать имя Gatherer'а (<bf>Gatherer-Name</bf>), который
сгенерировал его, номер порта (<bf>Gatherer-Port</bf>), который будет использоваться для экспорта
индексной информации, каталог, который содержит Gatherer
(<bf>Top-Directory</bf>). Заметьте, что есть один RootNode URL и один LeafNode
URL.

После того, как Gatherer закончит, он запустит демон Gatherer, который
будет экспортировать резюме содержимого. Чтобы посмотреть резюме, наберите:

<tscreen><verb>
        % gather localhost 9111 | more
</verb></tscreen>

Следующий объект SOIF должен выглядеть примерно как тот, который сгенерирует этот Gatherer.

<tscreen><verb>
        @FILE { http://harvest.cs.colorado.edu/~schwartz/IRTF.html
        Time-to-Live{7}:        9676800
        Last-Modification-Time{1}:      0
        Refresh-Rate{7}:        2419200
        Gatherer-Name{25}:      Example Gatherer Number 1
        Gatherer-Host{22}:      powell.cs.colorado.edu
        Gatherer-Version{3}:    0.4
        Update-Time{9}: 781478043
        Type{4}:        HTML
        File-Size{4}:   2099
        MD5{32}:        c2fa35fd44a47634f39086652e879170
        Partial-Text{151}:      research problems
        Mic Bowman
        Peter Danzig
        Udi Manber
        Michael Schwartz
        Darren Hardy
        talk
        talk
        Harvest
        talk
        Advanced
        Research Projects Agency

        URL-References{628}:
        ftp://ftp.cs.colorado.edu/pub/cs/techreports/schwartz/RD.ResearchProblems.Jour.ps.Z
        ftp://grand.central.org/afs/transarc.com/public/mic/html/Bio.html
        http://excalibur.usc.edu/people/danzig.html
        http://glimpse.cs.arizona.edu:1994/udi.html
        http://harvest.cs.colorado.edu/~schwartz/Home.html
        http://harvest.cs.colorado.edu/~hardy/Home.html
        ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/HPCC94.Slides.ps.Z
        ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/HPC94.Slides.ps.Z
        http://harvest.cs.colorado.edu/harvest/Home.html
        ftp://ftp.cs.colorado.edu/pub/cs/misc/schwartz/IETF.Jul94.Slides.ps.Z
        http://ftp.arpa.mil/ResearchAreas/NETS/Internet.html

        Title{84}:      IRTF Research Group on Resource Discovery
        IRTF Research Group on Resource Discovery

        Keywords{121}:  advanced agency bowman danzig darren hardy harvest manber mic
        michael peter problems projects research schwartz talk udi

        }
</verb></tscreen>

Заметьте, что хотя конфигурационный файл Gatherer'а содержит только 2 URL'а (один
в разделе RootNode и один в разделе LeafNode), появилось больше, чем 2
резюме в базе данных Gatherer'а. Gatherer развернул RootNode
URL на десятки LeafNode URL'ов рекурсивно извлекая ссылки из
файла HTML <em>http://harvest.cs.colorado.edu/</em>. Далее, для
каждого данного LeafNode в Gatherer'е, было сгенерировано резюме, как в приведенном выше
примере для
<em>http://harvest.cs.colorado.edu/&#126;schwartz/IRTF.html</em>.

Summarizer HTML извлечет структурированную информацию об авторе и заголовке
файла. Он также извлечет любые ссылки URL в атрибут
<em>URL-References</em>, а любой тэг привязки anchor -- в атрибут
<em>Partial-Text</em>. Остальная информация о файле HTML, такая как его
сумма MD5 (см. <htmlurl url="http://www.ietf.org/rfc/rfc1321.txt" name="RFC1321">) и его
размер (<em>File-Size</em>) в байтах также добавится в резюме содержимого.

<sect1>Пример 2 - включение информации, сгенерированной вручную
<label id="Example 2">

<p>
Gatherer способен ``разорвать'' ресурс в поток резюме.
Это полезно для файлов, которые содержат информацию, сгенерированную вручную,
которая может описывать один или более ресурсов, или для построения шлюза между
разными структурированными форматыми и SOIF (см. раздел
<ref id="The Summary Object Interchange Format (SOIF)"
name="Формат взаимообмена краткими изложениями документов (SOIF)">.

Этот пример демонстрирует ``взрыватель'' (exploder) для формата Linux Software Map (LSM).
Файлы LSM содержат структурированную информацию (как автор, размещение и т.д.)
о доступном ПО для операционных систем Linux.

Чтобы запустить это пример, наберите:

<tscreen><verb>
        % cd $HARVEST_HOME/gatherers/example-2
        % ./RunGatherer
</verb></tscreen>

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите
<em>example-2.cf</em>. Заметьте, что Gatherer имеет свой каталог
<em>Lib-Directory</em> (обратитесь в раздел
<ref id="Setting variables in the Gatherer configuration file"
name="Задание значений переменных в конфигурационном файле Gatherer'а">
за помощью в написании
конфигурационных файлов). Каталог библиотеки содержит настройки для типов и выбора кандидатов
Essence. В этом примере, мы только настроили шаг выбора кандидатов.
<em>lib/stoplist.cf</em> определяет типы, которые
Essence должен проиндексировать. Этот пример использует пустой файл <em>stoplist.cf</em>,
что говорит Essence индексировать все файлы.

Gatherer получает каждый из LeafNode URL'ов, которые являются файлами в формате Linux
Software Map в FTP архиве Linux <em>tsx-11.mit.edu</em>.
Gatherer понимает, что файл ``.lsm'' -- это файл типа <em>LSM</em>, так как
в <em>lib/byname.cf</em> присутствует эвристика по имени.Тип <em>LSM</em> --
это упакованный тип, что указано в исходном коде Essence
(<em>src/gatherer/essence/unnest.c</em>). Для упакованных типов запускаются
программы Exploder (называемые <tt>TypeName.unnest</tt>), а не обычные
summarizer'ы. Программа <tt>LSM.unnest</tt> -- это стандартная программа exploder,
которая берет файл <em>LSM</em> и генерирует один или более соотвествующих объектов
SOIF. Когда Gatherer завершает работу, он содержит один или более соответствующих
объектов SOIF для ПО, описанного в каждом файле <em>LSM</em>.

Потом Gatherer запускает демон Gatherer, который
будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

<tscreen><verb>
        % gather localhost 9222 | more
</verb></tscreen>

Так как <em>tsx-11.mit.edu</em> -- популярный и загруженный архив,
Gatherer часто не сможет получить файлы LSM. Если вы подозреваете, что
что-то подобное случилось, посмотрите <em>log.errors</em> и <em>log.gatherer</em>, чтобы
определить проблему.

Следующие два объекта SOIF были сгенерированы этим Gatherer'ом. Первый объект --
описывает сам файл <em>LSM</em>, а второй -- ПО, описанное в файле <em>LSM</em>.

<tscreen><verb>
        @FILE { ftp://tsx-11.mit.edu/pub/linux/docs/linux-doc-project/man-pages-1.4.lsm
        Time-to-Live{7}:        9676800
        Last-Modification-Time{9}:      781931042
        Refresh-Rate{7}:        2419200
        Gatherer-Name{25}:      Example Gatherer Number 2
        Gatherer-Host{22}:      powell.cs.colorado.edu
        Gatherer-Version{3}:    0.4
        Type{3}:        LSM
        Update-Time{9}: 781931042
        File-Size{3}:   848
        MD5{32}:        67377f3ea214ab680892c82906081caf
        }

        @FILE { ftp://ftp.cs.unc.edu/pub/faith/linux/man-pages-1.4.tar.gz
        Time-to-Live{7}:        9676800
        Last-Modification-Time{9}:      781931042
        Refresh-Rate{7}:        2419200
        Gatherer-Name{25}:      Example Gatherer Number 2
        Gatherer-Host{22}:      powell.cs.colorado.edu
        Gatherer-Version{3}:    0.4
        Update-Time{9}: 781931042
        Type{16}:       GNUCompressedTar
        Title{48}:      Section 2, 3, 4, 5, 7, and 9 man pages for Linux
        Version{3}:     1.4
        Description{124}:       Man pages for Linux.  Mostly section 2 is complete.  Section
        3 has over 200 man pages, but it still far from being finished.
        Author{27}:     Linux Documentation Project
        AuthorEmail{11}:        DOC channel
        Maintainer{9}:  Rik Faith
        MaintEmail{16}: faith@cs.unc.edu
        Site{45}:       ftp.cs.unc.edu
        sunsite.unc.edu
        tsx-11.mit.edu
        Path{94}:       /pub/faith/linux
        /pub/Linux/docs/linux-doc-project/man-pages
        /pub/linux/docs/linux-doc-project
        File{20}:       man-pages-1.4.tar.gz
        FileSize{4}:    170k
        CopyPolicy{47}: Public Domain or otherwise freely distributable
        Keywords{10}:   man
        pages

        Entered{24}:    Sun Sep 11 19:52:06 1994
        EnteredBy{9}:   Rik Faith
        CheckedEmail{16}:       faith@cs.unc.edu
        }
</verb></tscreen>

Мы также построили Gatherer, который переводит около пяти индесных файлов из
различных PC архивов в более, чем 25000 резюме. Каждый из этих индексных файлов
содержит сотни однострочных описаний о программном обеспечении,
которые доступны по анонимному доступу FTP.

<sect1>Пример 3 - Настройка распознавания типов и выбора кандидатов
<label id="Example 3">

<p>
Этот пример демонстрирует, как настроить шаги распознавание типов и
выбора кандидатов в Gatherer'е (см. раздел
<ref id="Customizing the type recognition, candidate selection,
presentation unnesting, and summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">).
Этот Gatherer распознает страницы WWW, и он
сконфигурирован только для собирания индексной информации с этих страниц.

Чтобы запустить этот пример, наберите:

<tscreen><verb>
        % cd $HARVEST_HOME/gatherers/example-3
        % ./RunGatherer
</verb></tscreen>

Чтобы посмотреть конфигурационный файл этого Gatherer'а, посмотрите
<em>example-3.cf</em>. Как в разделе
<ref id="Example 2"
name="Пример 2">,
этот Gatherer имеет свой библиотечный каталог, который содержит настройки
Essence. Так как мы заинтересованы только в индексировании домашних страниц, нам нужно только
определить эвристику для распознавания домашних страниц. Как показано ниже, мы можем использовать
эвристику по именам URL для определения домашних страниц в <em>lib/byurl.cf</em>. Мы также
добавили тип по умолчанию <em>Unknown</em>, чтобы сделать выбор кандидатов проще.

<tscreen><verb>
        HomeHTML                ^http:.*/$
        HomeHTML                ^http:.*[hH]ome\.html$
        HomeHTML                ^http:.*[hH]ome[pP]age\.html$
        HomeHTML                ^http:.*[wW]elcome\.html$
        HomeHTML                ^http:.*/index\.html$
</verb></tscreen>

Конфигурационный файл <em>lib/stoplist.cf</em> содержит список типов, которые не
надо индексировать. В этом примере <em>Unknown</em> -- это единственный тип, занесенный
в этот список, так что Gatherer будет отклонятьт только файлы типа
<em>Unknown</em>. Вы можете также распознавать URL'ы по именам файлов (в
<em>byname.cf</em>) или по содержимому (в <em>bycontent.cf</em> и
<em>magic</em>); хотя в этом примере, нам не нужно использовать эти
механизмы. Summarizer <tt>HomeHTML.sum</tt>, установленный по умолчанию, суммирует все
файлы <em>HomeHTML</em>.

После того, как Gatherer закончит работу, он запустит демон Gatherer, который
будет предоставлять резюме содержимого объектов. Вы заметите, что присутствуют только резюме для
файлов HomeHTML. Чтобы посмотреть резюме, наберите:

<tscreen><verb>
        % gather localhost 9333 | more
</verb></tscreen>

<sect1>Пример 4 - настройка распознавания типов и суммирование
<label id="Example 4">

<p>
Этот пример демонстрирует, как настроить шаги распознавания типов и
суммирования в Gatherer'е (см. раздел
<ref id="Customizing the type recognition, candidate selection, presentation unnesting, and
summarizing steps"
name="Настройка шагов распознавания типов, выбора кандидатов, извлечения прдставлений и суммирования">.
Gatherer распознает два новых формата файлов и суммирует их должным образм.

Чтобы посмотреть конфигурационный файл Gatherer'а, посмотрите
<em>example-4.cf</em>. Как в примерах в
<ref id="Example 2"
name="Пример 2">
и
<ref id="Example 3"
name="Пример 3">,
этот Gatherer имеет свой библиотечный каталог, который содержит
конфигурационные файлы Essence. Конфигурационные файлы Essence такие же, как
и для настроек по умолчанию, кроме <em>lib/byname.cf</em>, который содержит две
настройки для новых форматов файлов.

<sect2>Использование регулярных выражений для суммирования формата

<p>
Первый новый формат -- тип ``ReferBibliographic'', который
<tt>относится</tt> к использованию программ для представления библиографической информации.
Чтобы понять, что файл записан в этом формате, мы будем использовать соглашение, что
имена файлов заканчиваются на ``.referbib''. Таким образом, мы добавим эвристику по имени для
настройки распознвания типов. Эвристика по именам представляется в виде регулярного выражения
напротив имени файла в <em>lib/byname.cf</em>:

<tscreen><verb>
        ReferBibliographic      ^.*\.referbib$
</verb></tscreen>

Теперь, чтобы написать summarizer для этого типа, нам понадобится образец
файла ReferBibliographic:

<tscreen><verb>
        %A A. S. Tanenbaum
        %T Computer Networks
        %I Prentice Hall
        %C Englewood Cliffs, NJ
        %D 1988
</verb></tscreen>

Summarizer'ы Essence извлекают структурированную информацию из файлов. Один способ
написать summarizer -- использовать регулярные выражения для определения, что надо извлекать.
Для каждого типа информации, который вы хотите извлечь из файла, добавьте
регулярное выражение, которое подойдет для нужных строк в файл
<em>lib/quick-sum.cf</em>. Например, следующие регулярные выражения в
<em>lib/quick-sum.cf</em> извлекут автора, заглавие, дату и другую
информацию из файлов ReferBibliographic:

<tscreen><verb>
        ReferBibliographic      Author                  ^%A[ \t]+.*$
        ReferBibliographic      City                    ^%C[ \t]+.*$
        ReferBibliographic      Date                    ^%D[ \t]+.*$
        ReferBibliographic      Editor                  ^%E[ \t]+.*$
        ReferBibliographic      Comments                ^%H[ \t]+.*$
        ReferBibliographic      Issuer                  ^%I[ \t]+.*$
        ReferBibliographic      Journal                 ^%J[ \t]+.*$
        ReferBibliographic      Keywords                ^%K[ \t]+.*$
        ReferBibliographic      Label                   ^%L[ \t]+.*$
        ReferBibliographic      Number                  ^%N[ \t]+.*$
        ReferBibliographic      Comments                ^%O[ \t]+.*$
        ReferBibliographic      Page-Number             ^%P[ \t]+.*$
        ReferBibliographic      Unpublished-Info        ^%R[ \t]+.*$
        ReferBibliographic      Series-Title            ^%S[ \t]+.*$
        ReferBibliographic      Title                   ^%T[ \t]+.*$
        ReferBibliographic      Volume                  ^%V[ \t]+.*$
        ReferBibliographic      Abstract                ^%X[ \t]+.*$
</verb></tscreen>

Первое поле в <em>lib/quick-sum.cf</em> -- это имя типа.
Второе поле -- атрибут, под которым надо извлекать информацию в строках,
удовлетворяющих регулярному выражению из третьего поля.

<sect2>Использование программ для суммирования формата

<p>
Второй новый формат -- это тип ``Abstract'', который является файлом,
содержащим только текст с кратким описанием статьи (формат, который является принятым в
технических отчетах архивов FTP). Чтобы распознать, что файл написан в этом формате, мы
используем соглашение, что имена файлов типа ``Abstract'' заканчиваются на
``.abs''. Таким образом, мы добавим настройку распознавания типов в файл
<em>lib/byname.cf</em> в виде регулярного выражения:

<tscreen><verb>
        Abstract                ^.*\.abs$
</verb></tscreen>

Другой способ написания summarizer'а -- написать программу или скрипт, который принимает
имя файла как первый аргумент командной строки, извлекает структурированную
информацию, затем выдает результат в виде списка пар SOIF атрибут-значение.

Программы Summarizer называется <tt>TypeName.sum</tt>, так что мы назовем наш новый
summarizer <tt>Abstract.sum</tt>. Не забудьте поместить программу в каталог,
который есть в вашей переменной пути, чтобы Gatherer мог запустить ее. Вы увидите ниже,
что <tt>Abstract.sum</tt> -- это скрипт оболочки Bourne, который берет первые 50 строк
файла, объявляет их атрибутом ``Abstract'' и выдает
в виде пары SOIF атрибут-значение.

<tscreen><verb>
        #!/bin/sh
        #
        #  Usage: Abstract.sum filename
        #
        head -50 &quot;$1&quot; | wrapit &quot;Abstract&quot;
</verb></tscreen>

<sect2>Запуск примера

<p>
Чтобы запустить этот пример, наберите:

<tscreen><verb>
        % cd $HARVEST_HOME/gatherers/example-4
        % ./RunGatherer
</verb></tscreen>

После того, как Gatherer закончит свою работу, он запустит демон Gatherer, который
будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

<tscreen><verb>
        % gather localhost 9444 | more
</verb></tscreen>

<sect1>Пример 5 - Использование фильтров RootNode

<p>
Этот пример демонстрирует, как использовать фильтры RootNode для настройки
выбора кандидатов в Gatherer'е (см. раздел
<ref id="RootNode filters"
name="Фильтры RootNode">).
Только объекты, которые пройдут через фильтры, будут получены по сети (см. раздел
<ref id="Gatherer enumeration vs. candidate selection"
name="Нумерация Gatherer'а и выбор кандидатов">).

Чтобы запустить этот пример, наберите:

<tscreen><verb>
        % cd $HARVEST_HOME/gatherers/example-5
        % ./RunGatherer
</verb></tscreen>

После того, как Gatherer закончит свою работу, он запустит демон Gatherer, который
будет предоставлять резюме содержимого объектов. Чтобы посмотреть резюме, наберите:

<tscreen><verb>
        % gather localhost 9555 | more
</verb></tscreen>

<sect>История Harvest

<p>

<sect1>История Harvest

<p>
<itemize>
<item>1996-01-31: Harvest 1.4pl2 был последним официальным выпуском Darren R.
      Hardy, Michael F. Schwartz, и Duane Wessels.
<item>1997-04-21: Simon Wilkinson выпустил Harvest 1.5.
<item>1998-06-12: Simon Wilkinson выпустил Harvest 1.5.20.
<item>1999-05-26: Выпущен Harvest-MathNet100.tar.gz.
<item>2000-01-14: Выпущен harvest-modified-by-RL-Stajsic.tar.gz.
<item>2000-02-07: Harvest 1.6.1 выпустил Kang-Jin Lee при содействии с
      Simon Wilkinson.
<item>2002-10-01: Harvest 1.8.0 выпустили Harald Weinreich и
      Kang-Jin Lee.
</itemize>

<sect1>История документации Harvest

<p>
<itemize>
<item>1996-01-31: Документация Harvest для Harvest 1.4.pl2 была написана
      Darren R. Hardy, Michael F. Schwartz и Duane Wessels. Документ был написан
      в LaTeX. Стали также доступны версии HTML (конвертированный при помощи LaTeX2HTML) и Postscript.
<item>2001-04-27:HTML версия этого документа была обновлена и добавлена
      к дистрибутиву Harvest Kang-Jin Lee. Значительные изменения -- удаления разделов
      о кэше объектов Harvest и о Replicator'е, которые больше не являются частями
      Harvest.
<item>2002-01-28: Эта документация была конвертирована в linuxdoc. Сейчас она
      доступна в форматах PostScript, PDF, text и HTML.
<item>2003-04-22: Документация доступна на русском языке в формате HTML (Andrei Malashevich).
<item>2003-10-15: Документация доступна на русском языке в формате SGML (Andrei Malashevich).
</itemize>

</article>
