Как обустроить ht://Dig

Всякий, кто создает развесистые русскоязычные WWW-серверы рано или поздно сталкивается с проблемой организации 
поиска по ним. К сожалению, выбор до сих пор невелик — Yandex стоит денег (есть lite-версия, но с очень ограниченным объемом данных), с Rustem/rwww может справиться только его создатель, glimpse 
не понимает русской морфологии.

Остаются UDMSearch и ht://Dig. Несмотря на то, что UDMSearch хвалят больше, сам я по привычке продолжаю использовать ht://Dig. Этот продукт не лишен недостатков, но после приложения некоторых усилий его таки можно использовать. Основное преимущество этой программы перед glimpse — это возможность использования словарей от ispell для генерации словоформ (склонений, спряжений и так далее). Естественно, это умеют и Yandex и Rustem, но прочие недостатки у них перевешивают это достоинство.

Приборы и материалы
Чтобы поставить ht://Dig, нам понадобится сама эта программа (берется с http://www.htdig.org) и русские словари. Я рекомендую использовать словарь Александра Лебедева (берут с ftp://mch5.chem.msu.su/pub/russian/ispell/), т.к. словарь Владимира Роганова и Константина Книжника (второй из известных мне словарей для ispell) строит достаточно странные словоформы, пригодные для интерактивной проверки правописания, но непригодные, на мой взгляд, для автоматической генерации полного списка русских слов.

Инсталляция
Все написанное ниже относится к ht://Dig версии 3.1.5 и русскому словарю Лебедева версии 0.99c9. Более новые версии могут уже не содержать встреченных мной проблем. А проблемы эти таковы: 
1. htfuzzy (программа построения полного списка слов по словарю) предназначена для обработки ровно одного словаря. Если хочется использовать, например, и русский и английский, то этот недостаток нужно устранить. 
2. Словарь Лебедева (точнее, .aff-файл) предназначен для ispell и содержит конструкции вида 
У Т Ь >-ТЬ,-# гнуть >гну
Что, наверное, совершенно правильно для ispell, но для htfuzzy это правило должно выглядеть как 
У Т Ь >-ТЬ,# гнуть >гну
т.е. нужно заменить конструкции ",- " на просто запятую.
3. htsearch выдает абсолютную ссылку на проиндексированный документ (с именем WWW-сервера и портом, если он отличен от 80). При использовании Russian Apache с заданием кодировки в URL (по портам, по имени сервера и так далее) это неудобно — если клиент работает в кодировке, отличной от кодировки индексирования, то все ссылки на результаты поиска будут выданы ему не в его кодировке, а в кодировке, в которой производилось индексирование. 
Как водится, пришлось править по живому, в результате чего возник такой набор патчей: 
‰ http://www.lexa.ru:8101/lexa/htdig. patch1 Этот патч запрещает htfuzzy переносить файлы базы данных словоформ из $TMPDIR (или /tmp) в ..../htdig/common. Соответственно, при последовательном запуске htfuzzy с разными исходными словарями база данных будет дописана. 
‰ http://www.lexa.ru:8101/lexa/htdig. patch2 Этот патч к htsearch удаляет префикс http://server:port из всех URL'ей, начинающихся с HTTP.
Внимание. Автоматически исчезает возможность индексировать несколько серверов! Если нужен поиск по нескольким серверам, то проще всего, вероятно, индексировать URL'и с автоматическим выбором кодировки, тогда при обращении пользователя по ссылке с "результатов поиска" сервер (подразумевается использование Russian Apache) перекодирует все в кодировку клиента автоматически.
‰ http://www.lexa.ru:8101/lexa/htdig. patch3 Этот патч выключает кодирование запроса в виде %AA-кодов в ссылках на "другие страницы с найденными документами". 
Для тех, кому нужны все эти правки сразу, есть общий патч, объединяющий все 3 вышеописанных. Понадобятся исправления в файле описания русских аффиксов (хотел бы я знать правильное слово). Патч к версии 0.99c9 словаря Лебедева можно взять здесь. Если не хочется патчить, то можно взять файл окончаний целиком. htdig стоит распаковать, наложить патчи и поставить. В предположении, что htdig будет жить в /export/htdig, а файлы Apache живут в /export/apache, последовательность действий будет выглядеть как-то так: 
tar xzvf /path/to/htdig-3.1.5.tar.gz
patch -p0 < /path/to/htdig.patch
cd htdig-3.1.5

./configure --prefix=/export/htdig --exec-prefix=/export/htdig \
--with-cgi-bin-dir=/export/apache/cgi-bin \
--with-image-dir=/export/apache/htdocs/images \
--with-search-dir=/export/apache/htdocs/search 
make
su root 
make install

Если вы не правили файл конфигурации (CONFIG) и не задавали --prefix для configure, то все будет поставлено в /opt/www. Если правили, то туда, куда вы указали. В дальнейшем я предполагаю, что все установлено в /export/htdig 
Теперь следует сделать русский словарь: 
mkdir dict cd dict tar xzvf /path/to/rus-ispell-0.99c9.tar.gz make russian.dict russian.aff patch </path/to/russian.aff.patch cp russian.aff russian.dict /export/htdig/common
Генерация баз данных со словарями
Остаток работы можно сделать таким вот скриптом (он написан в предположении, что russian.aff и russian.dict уже находятся в /export/htdig/common, а файлы со словарями называются в htdig.conf words.aff и words.diff: 
endings_affix_file:/export/htdig/common/words.aff
endings_dictionary:/export/htdig/common/words.dict

Скрипт выглядит как-то так: 
#!/bin/sh cd /export/group/htdig/common mkdir ../tmp TMPDIR=/export/group/htdig/tmp export TMPDIR rm $TMPDIR/* cp english.aff words.aff cp english.0 words.dict ../bin/htfuzzy -v endings cp russian.aff words.aff cp russian.dict words.dict ../bin/htfuzzy -v endings  mv $TMPDIR/*db /export/group/htdig/common
database_dir:/export/htdig/db locale: ru_SU.KOI8-R start_url:http://www.lexa.ru:8100/apache-talk/ limit_urls_to:${start_url} exclude_urls:/cgi-bin/ .cgi max_head_length:10000 search_algorithm:exact:1,endings:1 endings_affix_file:/export/htdig/common/words.aff endings_dictionary:/export/htdig/common/words.dict maintainer:lexa@lexa.ru method_names: and "Все слова" or "Любое из слов" boolean "Язык запросов" nothing_found_file: /export/apache/htdocs/search/nomatch.html search_results_header: /export/apache/htdocs/search/header.html search_results_footer: /export/apache/htdocs/search/footer.html syntax_error_file: /export/apache/htdocs/search/syntax.html template_map: long long /export/apache/htdocs/search/template.html template_name: long next_page_text:<img src=/images/buttonr.gif border=0 align=middle width=30 height=30 alt=next> no_next_page_text: prev_page_text:<img src=/images/buttonl.gif border=0 align=middle width=30 height=30 alt=prev> no_prev_page_text: page_number_text:"<img src=/images/button1.gif border=0 align=middle width=30 height=30 alt=1>" \ "<img src=/images/button2.gif border=0 align=middle width=30 height=30 alt=2>" \ "<img src=/images/button3.gif border=0 align=middle width=30 height=30 alt=3>" \ "<img src=/images/button4.gif border=0 align=middle width=30 height=30 alt=4>" \ "<img src=/images/button5.gif border=0 align=middle width=30 height=30 alt=5>" \ "<img src=/images/button6.gif border=0 align=middle width=30 height=30 alt=6>" \ "<img src=/images/button7.gif border=0 align=middle width=30 height=30 alt=7>" \ "<img src=/images/button8.gif border=0 align=middle width=30 height=30 alt=8>" \ "<img src=/images/button9.gif border=0 align=middle width=30 height=30 alt=9>" \ "<img src=/images/button10.gif border=0 align=middle width=30 height=30 alt=10>" # # To make the current page stand out, we will put a border arround the # image for that page. # no_page_number_text:"<img src=/images/button1.gif border=2 align=middle width=30 height=30 alt=1>" \ "<img src=/images/button2.gif border=2 align=middle width=30 height=30 alt=2>" \ "<img src=/images/button3.gif border=2 align=middle width=30 height=30 alt=3>" \ "<img src=/images/button4.gif border=2 align=middle width=30 height=30 alt=4>" \ "<img src=/images/button5.gif border=2 align=middle width=30 height=30 alt=5>" \ "<img src=/images/button6.gif border=2 align=middle width=30 height=30 alt=6>" \ "<img src=/images/button7.gif border=2 align=middle width=30 height=30 alt=7>" \ "<img src=/images/button8.gif border=2 align=middle width=30 height=30 alt=8>" \ "<img src=/images/button9.gif border=2 align=middle width=30 height=30 alt=9>" \ "<img src=/images/button10.gif border=2 align=middle width=30 height=30 alt=10>"
Обработка словарей занимает несколько минут на Pentium-III 550.  На этом подготовительный этап можно считать оконченным. Конфигурационный файл у ht://Dig может быть, например, таким: См. Рис. 1. Для индексирования нескольких сайтов с разными кодировками можно использовать правки Сергея Парфенова —http://www.tms.ru/~sergey/htdig/
Алексей Тутубалин


Сетевые решения. Статья была опубликована в номере 01 за 2001 год в рубрике sysadmin