On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Как обустроить 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>"


Литература по Internet