div.main {margin-left: 20pt; margin-right: 20pt}
Как обустроить 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
Обработка словарей занимает несколько минут на Pentium-III 550.
На этом подготовительный этап можно считать оконченным. Конфигурационный файл у ht://Dig может быть, например, таким: См. Рис. 1.
Для индексирования нескольких сайтов с разными кодировками можно использовать правки Сергея Парфенова —
http://www.tms.ru/~sergey/htdig/
.
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>"
|