procmailとMHonArcとkakasiとnamazuで
メーリングリストをWeb公開&検索


メイリングリストに沢山参加していると活発なメイリングリストが一つでもあればもう自分のメイルボックスが溢れ返ってしまいます。
中には「いつかは必要になるかもしれない」情報ばかりで簡単に捨てるわけにもいきません。かと言って自分のメーラの中で検索するのでは遅くて使えない・・・
そういう状況を解決するためにnamazuを使った全文検索エンジンを実装してみました。

procmailのインストール

rootになって
cd /usr/ports/mail/procmail
make install
で終わり

MHonArcのインストール

これが紆余曲折・超難解・五里霧中・・・ いろいろ新しいバージョンが出ているけどMIMEのコンバートが旨くいかずで書籍についていた古めのMHonArc2.2.0にパッチを当てたモノを利用(通称なまず本)
パッチを当ててから
perl install.meです。
kakasiのインストール
namazuのインストール
nkfのインストール
これもports利用。 今回は面倒なのでportsを思いっきり使ってしまいました。

早速設定してみます。

http://www.hoge.net/ml/ で検索・閲覧ができるようにします。
wwwadmin:wwwがapacheを動かしているので
wwwadmin@www.hoge.net宛に振り分けたいメイルを全部forward設定。
受け取ったwww.hoge.net
/home/wwwadmin/.forward の一行目に
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #wwwadmin"
と記述。
mkdir /usr/local/apache/htdocs/ml/foo
とメイリングリストをHTML化したドキュメントを置く場所をつくっておき
/home/wwwadmin/.procmailrc には
LOGFILE=$HOME/procmail.log
MAILDIR=/var/mail
DEFAULT=/dev/null
:0
*^To.*pgsql-jp@sra.co.jp
| nkf -me -- | mhonarc -add -reverse -modtime -multipg -outdir /usr/local/apache/htdocs/ml/foo --
としておきます。
sendmailを使っているので/var/mailにメイルをとりにいき(qmailなら$HOME/Maildirとか)、:0以下のレシピにマッチすればそれなりの処理をします。マッチしなければ取っておいてもしようがないので/dev/nullして亡きモノ(?)にしてしまいます。
上の例だと
To:pgsql-jp@sra.co.jp
がヘッダにあるメイルはnkfに掛けられてMIME変換・EUCコード変換後MHonArcに掛けられて /usr/local/apache/htdocs/ml/foo 以下に ***.htmlがいくつか作られるようになります。
ここまででメイルをHTML化する作業は終了。
本当なら
http://www.hoge.net/ml/foo/maillist.html
を見るとさっきのメイリングリストの内容が見える筈なのですが、今さっき設定したばかりではメイルが届いていないので確認できません。
:0
*^To.*takamura@hoge.net
| nkf -me -- | mhonarc -add -reverse -modtime -multipg -outdir /usr/local/apache/htdocs/ml/foo --
とでもして動作確認用のレシピを追加しておいた方がよいでしょう。旨くいったら本チャン用のレシピに書き直します。(自分のサイトのテストの為にいきなりメイリングリスト宛にテストメイルを投げるのはやめましょう。)
旨くいったら次にnamazuです。
wwwadminでloginして
cp /usr/local/bin/namazu /usr/local/apache/cgi-bin/namazu.cgi
なまず用の設定ファイル
.namazurcを以下のように書きます。注意点は
INDEXと/usr/local/apache/index等の間はスペースではなくてtabを使わないといけません。(以下REPLACE WAKATI LOGGING SCORING同じ)
INDEX   /usr/local/apache/index
REPLACE /usr/local/apache/htdocs/       http://www.hoge.net/
WAKATI  /usr/local/bin/kakasi
LOGGING ON
LANG    ja
SCORING TFIDF
インデックスファイルを格納する場所をつくります。
mkdir /usr/local/apache/index
それから取りあえず手動でなまずのインデックスファイルを作ります。(勿論有る程度メイリングリストのデータがないと面白くないけど)
/usr/local/bin/mknmz -O /usr/local/apache/index /usr/local/apache/htdocs
とやると所定の場所にインデックスが作成されます。
旨くいったら、cronに登録しておきます。
0 * * * * wwwadmin /usr/local/bin/mknmz -O /usr/local/apache/index /usr/local/apache/htdocs 2>&1
30 * * * * wwwadmin /usr/local/bin/mknmz -O /usr/local/apache/index /usr/local/apache/htdocs 2>&1
と書いておけばインデックスの更新を30分おきに自動でやってくれます。当サイトは10分おきにしてあります。インデックスを追加するだけなので10分おきでも問題なしです。メイリングリストの流量次第でしょうが。時々(1ヶ月に一回くらい?)はrm NMZ.* してインデックスを再構築した方がよいでしょう。これもcronに書けます。
で、次に検索を掛けるhtmlを作っておかないとなりません。
当然ですが、途中で/cgi-bin/namazu.cgiを呼ぶため、apacheでExecCGIが設定されていないと動きません。念のため。
サンプルです。
search.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
        "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
<LINK REV=MADE href="mailto:webmaster@itoh.co.jp">
<TITLE>Namazu 全文検索システム</TITLE>
</HEAD>
<BODY LANG="ja">
<H1>Namazu 全文検索システム</H1>
<P>
<STRONG>インデックス(索引)は30分毎に自動更新されます。</STRONG>
</P>
<HR>
<FORM METHOD="GET" ACTION="/cgi-bin/namazu.cgi">
<P>
<STRONG>検索式:</STRONG>
<INPUT TYPE="TEXT" NAME="key" SIZE="40">
<INPUT TYPE="SUBMIT" NAME="submit" VALUE="Search!">
<INPUT TYPE="HIDDEN" NAME="whence" VALUE="0">
</P>
<P>
<STRONG>表示件数:</STRONG>
<SELECT NAME="max">
<OPTION VALUE="10">10
<OPTION SELECTED VALUE="20">20
<OPTION VALUE="30">30
<OPTION VALUE="50">50
<OPTION VALUE="100">100
</SELECT>
<STRONG>要約表示:</STRONG>
<SELECT NAME="format">
<OPTION SELECTED VALUE="long">ON
<OPTION VALUE="short">OFF
</SELECT>
</P>
<INPUT TYPE="HIDDEN" NAME="whence" VALUE="0">
</FORM>
<H2>検索の方法</H2>
<P>
大文字、小文字の区別はありません。<VAR>foo*</VAR> のように末尾にアスタリスクを指定する<br>
ことで前方一致検索が可能です。また、単語をスペース区切りで並べて書くとアンド<br>
検索になります。<br>
日本語は KAKASI/ChaSen によって分解され、「日本語情報処理」なら 「日本語」<br>
 「情報処理」 のように 2 つの単語に分かれてアンド検索されます。日本語の単語の<br>
分解は完全ではありません。品質は辞書によって決定されます。<br>
</P>
<P>
全角 (2 bytes) アルファベット・記号はすべて 1 byte として処理されます。記号を<br>
含む検索も可能で <CODE>TCP/IP</CODE> というような単語の検索も可能です。ただし、記号の処理<br>
は完全ではないので <CODE>TCP IP</CODE> のように分けてアンド検索をかけた方が取りこぼしが<br>
ありません。 (その代わり余計なファイルまでヒットしてしまう可能性もありますが)。<br>
</P>
<P>
括弧を含めたアンド検索とオア検索およびノット検索が可能になっており検索式に <br>
<CODE>&amp;  |  ! ( )</CODE> を用います。記号の代わりに <CODE>and/or/not</CODE> で指定する<br>
ことも可能です。<br>
検索式はひとつづつスペース区切りで入力しなければなりません。
たとえば
</P>
<UL>
<LI><CODE>( sed | awk ) ! perl &amp; regexp</CODE>
<LI><CODE>( sed or awk ) not perl and regexp</CODE>
</UL>
<P>
のように指定します。
</P>

<P>
といった検索をすることができます。これは「 sed または awk が含まれ、perl は含まれ<br>
ない、そして regexp が含まれる」文書を検索するという意味になります。
括弧のネストも<br>
できるので、さらに複雑な検索式で検索することも可能です。<br>
</P>
<P>フレーズをダブルクォーテーションまたは中括弧 '{' '}' で囲むこと
でフレーズ検索ができ<br>ます。ただし、精度は 100%ではありません。とき
どきはずれます。たとえば</P>
<UL>
<LI><CODE>"SIMPLE MAIL TRANSFER PROTOCOL"</CODE>
<LI><CODE>{SIMPLE MAIL TRANSFER PROTOCOL}</CODE>
</UL>
<P>
のように指定します。
</P>
<P>正規表現および中間一致/後方一致の検索も可能です。ただしちょっと
遅いです。これは<br>日本語も使えます。</P>
<UL>
<LI><CODE>*大学</CODE> (後方一致)
<LI><CODE>*ネット*</CODE>  (中間一致)
<LI><CODE>/インター?フェ[ーイ]ス/</CODE>  (正規表現)
<LI><CODE>"静岡県浜松市"</CODE>  (フレーズ)
</UL>
<P>
のように指定します。
</P>
<HR>
<P>
この全文検索システムは
<STRONG><A href="http://saturn.aichi-u.ac.jp/%7Eccsatoru/Namazu/">Namazu</A> v1.2.0.8</STRONG>
によって構築されています。
</P>
<ADDRESS>
<A href="mailto:webmaster@hoge.net">webmaster@hoge.net</A>
</ADDRESS>
</BODY>
</HTML>


高村のホームに戻る     いとうのホームへ