Tips & Triks

не ломается у того, кто ничего не делает...

Mailman - найдется все. Полнотекстовый поиск по рассылке.

, ,

Mailman является одной из самых популярных служб почтовой рассылки.
Просто потому что он легок в установке и настройке, а так же проверен
временем и людьми. Но при этом он совсем не является самым лучшим, т.к
имеет несколько минусов по сравнению с той же 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 страничках русский текст закодированным, и при индексировании документа с русским текстом, в индекс попадает просто набор символов, вроде этих:
&#1044;&#1086;&#1073;&#1088;&#1099;&#1081; &#1076;&#1077;&#1085;&#1100;
в Swish-e это предусмотрено, и можно подключить к каждому типу документов свои программы которые будут его обрабатывать и выдавать для индексации разумный текст. Только для этого нам еще понадобиться универсальный перекодировщик. Если у вас вся рассылка на английском, то можете закомментировать строчку FileFilter это намного увеличит скорость индексации. Для примера индексация одного архива листа рассылки размером 18Мб с поддержкой русского занимает 1.40 минуты, без поддержки русского языка 0.5 секунды(!).
aptitude install konwert
touch /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.cgi
diff /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'; Кто реализует тому с полки пирожок.

Репликация LDAP с поддержкой kerberos

Comments

Unregistered user Thursday, February 2, 2012 10:23:12 AM

zblk writes: День добрый! В первую очередь, хотелось поблагодарить автора за предоставленное руководство, оно помогло решить ряд не очевидных проблем. А теперь, собственно, сама причина, почему я сюда пишу: Настраивал swish-e для mailman описанным способом, за той лишь разницей, что у меня gentoo, а не debian и упёрся в проблему с кодировкой. Делаю конфиг для индексатора со строкой: FileFilter .html /здесь/мой/путь/convert "%p" Но на gentoo не оказалось konwert и исходников его я тоже не нашел, поэтому решил воспользоваться enca: /bin/cat $1 | /usr/bin/enconv -L ru -x utf-8 То есть, результат должен быть аналогичным - текст письма в русском UTF-8 НО, после того как натравливается swish-e на мой конфиг, и в результате получается индексный файл (ошибок при индексировании нет) то поиск по данному индексу осуществляется некорректно, то есть находятся варианты, для которых нет упоминаемых слов, и при выполнении поиска через веб сервер в тексте результатов поиска частично отображаются русские буквы, а частично вопросы. После небольшого поиска решения я наткнулся на следующую запись в FAQ: http://swish-e.org/docs/swish-faq.html#how_do_i_index_non_english_words_ Из которой следует, что swish-e не поддерживает UTF-8, в связи с чем я и решил обратиться сюда, так как либо есть какая-то хитрость, либо я что-то делаю не так...

Zl0 Wednesday, February 15, 2012 7:30:10 PM

Пропробуйте cp1251 =)

Unregistered user Sunday, February 26, 2012 9:53:20 AM

zblk writes: Боюсь, это невозможно :( Скорее мы откажемся от всей затеи с архивом. У Вас как-то получилось настроить UTF-8, хотелось понять в чем у нас проблема - какие версии программ использованы, как настроена операционка - locale, веб-сервер и прочее. Заранее спасибо за помощь.

Write a comment

New comments have been disabled for this post.

June 2012
M T W T F S S
May 2012July 2012
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30