Mailman - найдется все. Полнотекстовый поиск по рассылке.
Monday, August 15, 2011 1:22:17 PM
Mailman является одной из самых популярных служб почтовой рассылки.
Просто потому что он легок в установке и настройке, а так же проверен
временем и людьми. Но при этом он совсем не является самым лучшим, т.к
имеет несколько минусов по сравнению с той же Sympa, один из них это отсутствие
поиска по архиву.
Просто потому что он легок в установке и настройке, а так же проверен
временем и людьми. Но при этом он совсем не является самым лучшим, т.к
имеет несколько минусов по сравнению с той же Sympa, один из них это отсутствие
поиска по архиву.
И так, проблема, вот мы накопили рассылки за 8 лет. Что-то найти там почти нереально если не помнишь где искать и примерно когда, т.к mailman предлагает только деление рассылки по времени, ну а дальше уже как повезет. Поисковых движков, чтобы помочь сделать поиск по рассылке, нашлось несколько: Namazu2 (сайт проекта) - входит в состав debian, прост в настройке, не нашел способа перекодировки и индексации русского языка. Mailocate(документация) - скрипт на python использующий движок whoosh, по описанию крайне прост в установке, но не попробовал, т.к требует python библиотеки которых в lenny еще нет. В squeeze появились, так что может кто попробует и расскажет. Swish-e (сайт проекта)- входит в состав debian, достаточно наворочен, о нем и пойдет речь. На сайте проекта Swish обещают, что это очень быстрая поисковая система, которая может индексировать почти что все, что можно прочитать, ну нам нужно html только и всего. Общая концепция Есть порядка 50 листов рассылки, объемом 18гб, в рассылках есть и русский, и английский, а так же куча приаттаченных документов. По каждому листу рассылки будет сделан свой индекс. Искать можно будет как стандартно предлагает swish-e по теме, теме+телу письма, плюс мы добавим e-mail и автора письма. Так же будут добавлены дополнительные сортировки вывода результата поиска по автору и e-mail. Установка
aptitutde install swish-eСоздаем директорию где будут лежать индексы, файлы конфигурации и пр. мелочи.
mkdir /var/cache/swish-e mkdir /var/cache/swish-e/index mkdir /var/cache/swish-e/cgi-config mkdir /var/cache/swish-e/list-config chown -R root:www-data /var/cache/swish-e/Схема такая каждого веб архива рассылки, есть форма поиска по архиву. Каждая форма передает запросы своему cgi скрипту, который знает в каком индексе ему искать. Так же есть есть скрипт который генерирует конфиг для подготовки индекса каждого архива рассылки. Заготовки конфигов. Далее в конфигах XXXXX и YYYYY это те места, которые будут изменяться для каждого листа. Файл конфигурации для скрипта веб поиска. touch /var/cache/swish-e/swishcgi.config
return {
title => 'Search in XXXXX mailing list',
swish_binary => '/usr/bin/swish-e',
swish_binary => '/usr/bin/swish-e',
swish_index => '/var/cache/swish-e/index/XXXXX.mailman.index',
secondary_sort => [qw/swishtitle/],
sorts => [qw/swishrank swishtitle author email/],
metanames => [qw/ swishdefault swishtitle author email/],
display_props => [qw/swishdocsize/],
name_labels => {
author => 'Author',
email => 'Email',
swishdefault => 'Subject & Body',
swishtitle => 'Subject',
swishrank => 'Rank',
},
}
Файл конфигурации для подготовки индекса по архиву рассылки
c поддержкой русского языка. Для латинских списков, создайте
файл en.list.config из ru.list.config и закомментируйте в нем последнюю строку.
touch /var/cache/swish-e/ru.list.config
# Index file - this is what Swish will create
IndexFile /var/cache/swish-e/index/XXXXX.mailman.index
# Root of our Mailman archives - everything under here will be indexed
IndexDir /var/lib/mailman/archives/public/YYYYY
# We want to index .html files only
IndexOnly .html
IndexReport 3
MinWordLimit 3
IgnoreFirstChar .-_'
IgnoreLastChar .-_'
# Don't index summary pages: author.html, date.html etc.
FileRules filename is (author\.html|date\.html|index\.html|subject\.html|thread\.html)
# В моем случая я не хотел индексировать приложения к письма, если вы желаете можете закомментировать.
FileRules dirname contains (attachments|database)
# Replace local (physical) path with the web-accessible path
ReplaceRules replace "/var/lib/mailman/archives/public/" "/mailman/"
# Store description in search results
IndexContents HTML .html
StoreDescription HTML <pre> 200000
# Look at the title, too
# Запоминать дополнительные мета-теги в документах
MetaNames swishtitle author email subject
# Дополнительные поля для сортировки
PropertyNames author email subject
FollowSymLinks yes
ConvertHTMLEntities yes
FuzzyIndexingMode Stemming_ru
# Перекодировка HTML Entities в русский текст
# доступныйдля индексации и дальнейшего поиска
FileFilter .html /var/cache/swish-e/convert "%p"
Сейчас объясню почему с Namazu2 у меня не пошло, дело в том чтобы
mailman хранит в html страничках русский текст закодированным,
и при индексировании документа с русским текстом, в индекс попадает
просто набор символов, вроде этих:
Добрый деньв Swish-e это предусмотрено, и можно подключить к каждому типу документов свои программы которые будут его обрабатывать и выдавать для индексации разумный текст. Только для этого нам еще понадобиться универсальный перекодировщик. Если у вас вся рассылка на английском, то можете закомментировать строчку FileFilter это намного увеличит скорость индексации. Для примера индексация одного архива листа рассылки размером 18Мб с поддержкой русского занимает 1.40 минуты, без поддержки русского языка 0.5 секунды(!).
aptitude install konwerttouch /var/cache/swish-e/convert
#!/bin/bash
# Convert all to RU-UTF8
cat $1 |/usr/bin/konwert any/ru-utf8
Теперь перед индексацией документ сначала будет перекодирован, и лишь потом проиндексирован.
Сам cgi скрипт поиска нужно тоже слегка подготовить
cp /usr/lib/swish-e/swish.cgi /var/cache/swish-e/swish.cgidiff /var/cache/swish-e/swish.cgi
- my $DEFAULT_CONFIG_FILE = '.swishcgi.conf'; + my $DEFAULT_CONFIG_FILE = '/var/cache/swish-e/cgi-config/XXXXX.swishcgi.config';Для создание конфигов и индексов используется такой топорный скрипт. touch /var/cache/swish-e/build-and-index.sh
#!/bin/bash
LISTS=$(ls -1 /var/lib/mailman/archives/private |grep -v mbox)
CGI_DIR='/var/lib/mailman/cgi-bin'
# Листы с поддержкой русского поиска
RULIST=( mylistname1 mylistname2 mylistnameN )
check_rulist() {
for i in ${RULIST[@]}; do
if [ "$1" = "$i" ]; then
return 1
fi
done
}
for LIST in $LISTS; do
# Get listname by index.html in directory
LISTNAME=$(cat /srv/repos/mailman/archives/private/$LIST/index.html | \
sed 's/^[ \t]*//;/The /q; / Archives:/h; /./d;g;q;'|cut -d " " -f 2)
LISTNAME_LR=$(echo $LISTNAME|tr "[:upper:]" "[:lower:]")
# Check list by language
check_rulist $LIST
return_val=$?
if [ "$return_val" -eq 1 ]; then
LANG=ru
else
LANG=en
fi
# Create list CONFIG
cat /var/cache/swish-e/$LANG.list.config |sed s/XXXXX/$LISTNAME/g | sed s/YYYYY/$LISTNAME_LR/g > \
/var/cache/swish-e/list-config/$LISTNAME.maimain.config
# Create CGI CONFIG
cat /var/cache/swish-e/swishcgi.conf |sed s/XXXXX/$LISTNAME/g > \
/var/cache/swish-e/cgi-config/$LISTNAME.swishcgi.conf
# Create CGI_DIR
if [ ! -d $CGI_DIR/$LISTNAME ]; then
mkdir $CGI_DIR/$LISTNAME
cat /var/cache/swish-e/swish.cgi | sed s/XXXXX/$LISTNAME/g > $CGI_DIR/$LISTNAME/swish.cgi
chmod 755 $CGI_DIR/$LISTNAME/swish.cgi
fi
# Create INDEX
#su -c "swish-e -c /var/cache/swish-e/list-config/$LISTNAME.mailman.config" www-data
echo $LANG - $LISTNAME
done
Перед запуском скрипта build-and-index.sh нужно поправить шаблоны mailman.
И пересоздать все страницы архивов рассылки заново.
Добавим в шаблон страниц с письмами наши метатеги.
diff /etc/mailman/en/article.html
<META NAME="robots" CONTENT="index,nofollow"> + <META NAME="author" CONTENT="%(author_html)s"> + <META NAME="email" CONTENT="%(email_html)s"> + <META NAME="subject" CONTENT="%(subject_html)s">Добавим в шаблон архива рассылки форму поиска по списку. diff /etc/mailman/en/archtocnombox.html
You can get <a href="%(listinfo)s">more information about this list</a>.
</p>
+<B>Search in %(listname)s Archives</B>
+ <form method="get" action="/cgi-bin/mailman/%(listname)s/swish.cgi" enctype="application/x-www-form-urlencoded" class="form">
+ <input maxlength="200" value="" size="32" type="text" name="query"/>
+ <input value="Search!" type="submit" name="submit"/>
+ <br>
+ Sort by:
+ <select name="sort">
+ <option selected value="swishrank">Rank
+ <option value="swishtitle">Subject
+ <option value="author">Author
+ <option value="email">E-Mail
+ </select>
+ <br>
+ Limit search to:
+ <input type="radio" name="metaname" value="swishdefault" checked/>Subject & Body
+ <input type="radio" name="metaname" value="swishtitle"/>Subject
+ <input type="radio" name="metaname" value="author"/>Author
+ <input type="radio" name="metaname" value="email"/>E-Mail
+ </form>
+</br>
Обратите внимание на action в форме, ваш путь в адресной строке к cgi скриптам может(наверняка) быть другим.
Пересоздать страницы архива можно вручную следующими коммандами
/etc/init.d/mailman stop /var/lib/mailman/bin/arch --wipe LISTNAME /etc/init.d/mailman startМожно вот таким скриптом.
#!/bin/sh
# Rebuild templates all mailman html
/etc/init.d/mailman stop
LISTS=$(ls -1 /var/lib/mailman/archives/private |grep -v mbox)
for LIST in $LISTS; do
/var/lib/mailman/bin/arch --wipe $LIST
done
/etc/init.d/mailman start
18Гб лопатилось порядка 50 минут.
После пересоздания всех страниц можно запускать индексер build-and-index.sh
После индексации поиск заработал, да вот только русский текст выдавался
в ISO1 кодировке. Дело в том что cgi скрипт который готовит шаблон вывода
результатов поиска делает такие HTTP-headers по-умолчанию.
Чтобы это исправить и отдавать результаты поиска в той же кодировке, что и наш
индекс, а именно в UTF-8, меняем параметры в библиотеке шаблонизатора.
diff /usr/lib/swish-e/perl/SWISH/TemplateDefault.pm
my $q = $results->CGI;
+ my $output = $q->header() . page_header( $results );
- my $output = $q->header(-charset=>"utf-8") . page_header( $results );
Ссылки по теме:
Статья "Локальный поисковик Swish"
Сайт проекта Whoosh
Integrating Mailman with a Swish-e
P.S. Есть идея немного улучшить данную конфигурацию, а именно, сделать в apache
SetEnv $REQUEST_URI , после чего редиректить запрос на один единственный swish.cgi, в
котором принять эту переменную окружения за путь к конфигу индекса.
Схема примерно такая:
запрос http://example.org/mailman/cgi/ListNameX/swish.cgi
SetEnv LN ListnameX
Redirect http://example.org/mailman/cgi/swish.cgi
our $listname = $cgi->LN
my $DEFAULT_CONFIG_FILE = '/var/cache/swish-e/cgi-config/$listname.swishcgi.config';
Кто реализует тому с полки пирожок.








Unregistered user # Thursday, February 2, 2012 10:23:12 AM
Zl0 # Wednesday, February 15, 2012 7:30:10 PM
Unregistered user # Sunday, February 26, 2012 9:53:20 AM