Namazu

最終更新日時:2014-02-27 00:00:00
その他UNIX系

Namazu とは


Namazu は 非常に高速な日本語全文検索エンジンです。
検索対象は HTML を初めとしたテキストファイルはもちろんですが、bzip2, gzip, compress 等で圧縮されたテキストファイルや Excel, Word, man 等の文書ファイルにも対応できます。
検索インターフェイスも、普通にコマンドラインからの検索以外に、CGI として動作させることを目的とした namazu.cgi が最初から用意され、その他にも Emacs 上からの利用も可能です。

インストール


namazu-2.0.16 の例です。

Namazu のインストールには、File::MMagic, nkfが必要なのでそれぞれできれば最新版をインストールしておきます。
また、これとは別に形態素解析アプリケーションとしてKAKASIもしくはChasenをインストールしておく必要があります。
現状では、Chasen の方が検索精度が良さそうです。
さらに、インデックス化の際の性能が劇的に変わるので、可能な限り、NKF.pm と Text::Kakasi, Text::Chasen もインストールしておいた方が良いです。

準備が整ったら Namazu 本体のインストールを行います。
全文検索システム Namazu からアーカイブを取得し、展開します。

 % gzip -dc namazu-2.0.16.tar.gz | tar xvf -
 % cd namazu-2.0.16


あとはお決まりの手順です。

 % ./configure
 % make
 % make check
 % su
 # make install 


設定


まず、インデックス作成時の設定ファイル mknmzrc を作成します。
これは /usr/local/etc/namazu に mknmzrc_sample というファイルがあるので、これをコピーして、その後編集します。
基本的にはただコピーするだけでも問題ありませんが、性能の問題がある場合があります。
その際は、後述の「mknmz の性能について]]を参照してください。

次に検索時の設定ファイル namazurc を作成します。
これも /usr/local/etc/namazu に namazurc_sample というファイルがあるので、これをもとに namazurc を作成します。

使用方法


まず、検索対象となる文書のインデックスを作成します。
インデックスの作成には、mknmz コマンドを使用します。

 % mknmz -O インデックス出力先ディレクトリ 対象ディレクトリ [ ... ] 


という感じです。
-O 指定が無い場合にはデフォルトの場所にインデックスが作成されます。
「対象ディレクトリ」はターゲットとなる文書の先頭のディレクトリを指定します。
指定したディレクトリ以降の文書は全てターゲットとなります。

これで検索をする準備が整いました。
コマンドラインでの検索は以下のような感じです。

 % namazu "検索したい文字列" [ インデックスディレクトリ ... ] 


インデックスをデフォルトの場所に作成した場合には「インデックスディレクトリ」を指定する必要はありません。

namazu.cgi


コマンドラインで namazu を実行すると標準出力に検索結果が帰ってくるので、これを利用して CGI で namazu を使っても問題ないのですが、Namazu には CGI として使われる namazu.cgi が最初から入っています。
namazu.cgiはCGIで使用されることを想定した作りになっていますので、とても手軽に検索CGIとして使うことが出来ます。
また、namazu.cgi自体がCGIとして実行されますので、処理速度もこちらの方が断然速いです。

namazu.cgiを使用するには基本的には/usr/local/libexec にインストールされた namazu.cgi を cgi-bin 等の CGI が使用可能なディレクトリにコピーするだけです。
その他インデックスディレクトリ等カスタマイズが必要な場合には、適宜設定します。
namazu.cgiの設定は、namazu.cgiと同じディレクトリに.namazurc というファイル作成し、そこに設定を書きます。
以下、設定例です。

Lang ja
Index /usr/local/share/namazu/index
Replace /home/http/htdoc /

複数インデックスにして使う


Namazu では異なるディレクトリにインデックスを出力し、検索時には複数のインデックスから検索するということが可能です。
異なるディレクトリにインデックスを出力するのは、単純に mknmz の -O でインデックスの出力先を指定して、それぞれインデックスを作成すればOK。
namazu で複数インデックスから検索するには、最後にインデックスを複数並べて指定すればOKです。

namazu.cgi から複数インデックスを検索させるには以下のようにします。
まず、namazu.cgi が見に行く NMZ.head.ja を複数のインデックスから選択できるように以下のように編集します。

 <strong>検索対象</strong>
 <ul>
 <li><input type="checkbox" name="idxname" value="linux">Linux ML
 <li><input type="checkbox" name="idxname" value="apache">Apache ML
 </ul>


value にはインデックスディレクトリを指定します。
上記の例の場合、このディレクトリの下に linux と apache というディレクトリがあり、それがそれぞれ Linux ML のインデックスディレクトリ、 Apache ML のインデックスディレクトリとなっています。

gcnmz


コマンド名が表すとおり、Namazu インデックスの GC を行うコマンドです。
mknmz で生成するインデックスは例えば、対象となるファイルが削除されても既に存在するインデックスは削除されません。
このように、mknmz で繰り返しインデックスを生成し直していくと徐々に不要なインデックスが蓄積されていきます。
この不要なインデックスを削除するのが gcnmz です。
通常、1週間に1回程度動かしておけば十分でしょう。


mknmz の性能について


mknmz は何も考えずに Namazu をインストールしてしまうと、おそろしく性能が悪いことがあります。
とりあえず、今現在の設定がどのようになっているのかをまず確認します。

 % mknmz -C


これで mknmz の各設定が確認できますが、ここで重要なのが「わかち書き」です。
ここで、わかち書きのための実行コマンドが表示されてしまう場合には、わかち書きのたびにコマンドが実行されてしまうので、非常に性能が劣化します。
従って、最低限、ここは Perl モジュールを使うように設定しておきましょう。
同様に、NKF も Perl モジュールが使われるようにしておくと性能が向上します。

設定は、mknmzrc にて設定します。
以下、設定例です。

 $CHASEN = "module_chasen -i e -j -F '%m '"
 $NKF = "module_nkf";


こうして、再度 mknmz -C で確認すると、以下のように表示され、Perl モジュールが使われることが確認できます。

 NKF: module_nkf
 わかち書き: module_chasen -i e -j -F '%m '


お問い合わせは 掲示板 にて。