Namazu-2.0.4

[サーバの実験室 Redhat/Fedora]

作成 : 2005/02/13

"サーバの実験室"の検索


Namazu

日本語全文検索システム。 CGIにより、WEBサイトの全文検索ができる。 本家はhttp://www.namazu.org/

nkfとperl-NKF

Fedora Core 3のRPMパッケージから、nkf(NKF本体)とperl-NKF(perlからNKFを利用するためのモジュール)をインストール可能。 nkfのソースはhttp://www01.tcp-ip.or.jp/~furukawa/nkf_utf8/からダウンロードできる。

# rpm -ivh nkf-2.04-3.rpm
# rpm -ivh perl-NKF-2.04-3.rpm

KakasiとText-Kakasi

Namazuで日本語を扱うには、KakasiまたはChaSenが必要。 Kakasiのほうが簡単で速いらしい。 両方インストールしておくとKakasiが優先され、インデックスを作成するときにどちらを使用するか選択して実行することもできる。

Fedora Core 3のRPMパッケージから、kakasi(Kakasi本体)とkakasi-dict(Kakasi辞書)perl-Text-Kakasi(perlからKakasiを利用するためのモジュール)をインストール可能。 kakasiのソースはhttp://kakasi.namazu.org/からダウンロードできる。 Text-Kakasiのソースはhttp://search.cpan.org/dist/Text-Kakasi/からダウンロードできる。

# rpm -ivh nkf-2.04-3.rpm
# rpm -ivh perl-NKF-2.04-3.rpm

ChaSenとText-ChaSen

ChaSenはソースからコンパイル。

Darts

ChaSenをコンパイルするときに、Dartsが必要になる ソースはhttp://chasen.org/~taku/software/darts/からダウンロード。

# tar -zxvf darts-0.2.tar.gz
# cd darts-0.2
# ./configure
# make
# make install    <--- /usr/local/includeにdarts.hがインストールされる

注意! Dartsをインストールしておかないと、ChaSenをconfigureするときエラーになる。

Dartsがない場合、ChaSenのconfigureでエラー

# ./configure
...
checking for darts.h... configure: error: no header of Darts. You need to fetch Darts from http://cl.aist-nara.ac.jp/~taku-ku/software/darts/.

ChaSen

次にChaSen本体をインストールする。 ソースはhttp://chasen.naist.jp/hiki/ChaSen/からダウンロード。

# tar -zxvf chasen-2.3.3.tar.gz
# cd chasen-2.3.3
# ./configure --with-darts=/usr/local/include    <--- darts.hの場所を指定してconfigure

そのままmakeするとエラーになった。

そのままmake

# make
...
dartsdic.cpp: In function `int da_build_dump(da_build_t*, char*, FILE*)':
dartsdic.cpp:180: error: ISO C++ forbids cast to non-reference type used as lvalue

GCC-3.4.0からキャストチェックが厳密になったためだそうです... lib/dartsdic.cppの180行目を修正して、再度make。

lib/dartsdic.cpp

        lens[size] = key.size();
//      (const char*)keys[size] = key.data();    削除
        keys[size] = (char*)key.data();    //追加
        vals[size] = redump_lex(lens[size], lex_indices, tmpfile, lexfile);
# make
# make install    <--- /usr/local/libにライブラリがインストールされる

/etc/ld.so.confファイルにライブラリの検索パスを設定し、ldconfigを実行する。

/etc/ld.so.conf

/usr/local/lib    <--- ChaSenライブラリをインストールしたディレクトリを追加
# ldconfig

注意! ライブラリの検索パスを設定しておかないと、後々mknmzを実行するときエラーになる。

mknmz実行時、ChaSenライブラリが見つからないエラー

# mknmz -c --indexing-lang="ja_JP.eucJP" /var/www/html/
Can't load '/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Text/ChaSen/ChaSen.so' for module Text::ChaSen: libchasen.so.0: cannot open shared object file: No such file or directory at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 230.
 at /usr/local/bin/mknmz line 910

ipadic

次にipadic(ChaSen辞書)をインストールする。 ソースはhttp://chasen.naist.jp/hiki/ChaSen/(メニューの"茶筌の配布"あたり)からダウンロード。

# tar -zxvf ipadic-2.6.3.tar.gz
# cd ipadic-2.6.3
# ./configure
# make
# make install

注意! ipadicをインストールしておかないと、後々mknmzを実行するときエラーになる。

mknmz実行時、設定ファイルchasenrcが見つからないエラー

# mknmz -c --indexing-lang="ja_JP.eucJP" /var/www/html/
chasen: can't open .chasenrc, .jumanrc, or /usr/local/etc/chasenrc

Text-Chasen

最後にText-ChaSen(ChaSenをPerlから利用するためのモジュール)をインストールする。 ソースはhttp://www.daionet.gr.jp/~knok/chasen/からダウンロード。

# tar -zxvf Text-ChaSen-1.03.tar.gz
# cd Text-ChaSen-1.03

READMEに書いてあるようにMakefile.PLを修正して、コンパイルする。

README

....
2. インストール

Text-ChaSen-1.01.tar.gzを展開し、作成されたディレクトリ
Text-ChaSen-1.01に移動します。
次にMakefile.PLを編集し、以下の内容が書かれている行を修正して、
libchasen.aの存在するディレクトリを指定します。

'LIBS' => ['-lchasen']

例: /usr/local/libにlibchasen.aがある場合

'LIBS' => ['-L/usr/local/lib -lchasen']
....
Makefile.PL

use ExtUtils::MakeMaker;

WriteMakefile(
              'NAME' => 'Text::ChaSen',
              'VERSION_FROM' => 'ChaSen.pm',
              'LIBS' => ['-L/usr/local/lib -lchasen -lstdc++']
);
# perl Makefile.PL
# make
# make install

注意! Makefile.PLを修正してコンパイルしないと、後々mknmzを実行するときエラーになる。

Makefile.PLを修正しなかった場合のmknmz実行時エラー

# mknmz -c --indexing-lang="ja_JP.eucJP" /var/www/html/
/usr/bin/perl: symbol lookup error: /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Text/ChaSen/ChaSen.so: undefined symbol: chasen_getopt_argv

注意! Makefile.PLの'LIBS'に"-lstdc++"を追加してコンパイルしないと、後々mknmzを実行するときエラーになる。

Makefile.PLの'LIBS'に"-lstdc++"を追加しなかった場合のmknmz実行時エラー

# mknmz -c --indexing-lang="ja_JP.eucJP" /var/www/html/
Can't load '/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/Text/ChaSen/ChaSen.so' for module Text::ChaSen: /usr/local/lib/libchasen.so.0: undefined symbol: _ZSt4cerr at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 230.
 at /usr/local/bin/mknmz line 910
Compilation failed in require at /usr/local/bin/mknmz line 910.

namazu

namazuのソースをhttp://www.namazu.org/からダウンロードして、コンパイル。 同梱のFile-MMagicもコンパイルする。

# tar -zxvf namazu-2.0.14.tar.gz
# cd namazu-2.0.14

# cd File-MMagic
# ./configure
# perl Makefile.pl; make
# make install

# cd ..
# ./configure
# make
# make install

namazu.cgiによるWEB全文検索

namazu.cgiを利用して、WEB全文検索をしてみる。

ディレクトリ構成

/var/www/
    +- html/    <--- HTMLドキュメントルート
    |    +- namazu/
    |          +- namazu.cgi    <--- namazu.cgi
    |          +- .namazurc    <--- namazu.cgiの設定ファイル
    +- namazu/    <--- Namazuのインデックスとテンプレートを置くディレクトリ

インデックスの作成

mknmzでインデックスを作成する。 下の例では、/var/www/htmlディレクトリ以下のファイルを対象としたインデックスを作成する。 実行すると、/var/www/namazuディレクトリにインデックスとテンプレートができる。

# mknmz -c --index-lang="ja_JP.eucJP" -O /var/www/namazu /var/www/html

    -c : インデックスの作成に茶筌を使用
         (-cをつけないとKakasiを使用する)
    -O : インデックスの作成先ディレクトリ
    --index-lang : 指定した言語で処理

namazu.cgiと設定ファイル

namazu.cgi/var/www/html/namazuディレクトリにコピーする。 namazu.cgiのパーミッションは、"755"あたりで。 設定サンプルファイルnamazurc-sampleを、namazu.cgiと同じディレクトリに.namazurcという名前でコピーする。

# cp /usr/local/libexec/namazu.cgi /var/www/html/namazu/
# chmod 755 /var/www/html/namazu/namazu.cgi
# cp /usr/local/etc/namazurc-sample /var/www/html/namazu/.namazurc

.namazurcをサイトに合わせて修正する。

.namazurc

Index      /var/www/namazu    <--- インデックスのあるディレクトリ

Template   /var/www/namazu    <--- テンプレートのあるディレクトリ

Replace    /var/www/html/     http://www.greensleeves.jp/    <--- ファイルシステムとURLの置換

Lang       ja_JP.eucJP    <--- 言語の設定

Apacheの設定(httpd.conf)

/var/www/html/namazuディレクトリでCGIを実行できるようにする。 いちおう、.namazurcファイルにアクセスできないようにする。

httpd.conf

<Directory "/var/www/html/namazu">
  Options ExecCGI
  <Files ~ "\.namazurc">
    Order allow,deny
    Deny from all
  </Files>
</Directory>

httpd.confを修正したら、サービスを再起動すること。

# /etc/init.d/httpd restart

テスト : namazu.cgiの実行

namazu.cgiにアクセスして、下のようなページが表示されれば成功。

namazu

定期的にインデックスを更新(cron)

定期的にmknmzでインデックスを更新するよう、/etc/crontabファイルに記述する。/etc/cron.d/namazu_updateファイルを作成し、記述する。 下の例では、毎日2:00にインデックスを更新する。

/etc/cron.d/namazu_update

....
00 2 * * * root /usr/local/bin/mknmz -c --index-lang="ja_JP.eucJP" -O /var/www/namazu /var/www/html

namazu.cgiの表示をカスタマイズ(EUC-JP)

namazu.cgiの表示をカスタマイズしてみる。 簡単なものから順に...

テンプレートファイル(NMZ.*.ja)

mknmzでインデックスを作成すると、同じディレクトリにテンプレートも作成される。 これを修正することにより、namazu.cgiの表示をカスタマイズすることができる。

NMZ.head.ja    <--- ヘッダ
NMZ.body.ja    <--- 検索式の説明
NMZ.foot.ja    <--- フッタ
NMZ.result.normal.ja    <--- 通常の検索結果(サマリあり)
NMZ.result.short.ja    <--- 短い検索結果(サマリなし)
NMZ.tips.ja    <--- 結果が0件のとき表示される、Tips

これらのファイルは、削除してもmknmzを実行すると再生成されるようだ。 不要な場合は、中身を空にする。

/usr/local/share/locale/ja/LC_MESSAGES/namazu.mo

テンプレートでは、"検索結果"とか"検索式にマッチするxx個の文書が見つかりました。"とか"ペイジ"とかの表示を変更できない。 英語と日本語のメッセージを対応させるファイルnamazu.moで変更することができる。

namazu.moを直接編集してはいけない。 ソースを展開したディレクトリnamazu-2.0.4/po/ja.poを編集して、msgfmtで変換する。

# cd namazu-2.0.4/po
ja.poを修正
# msgfmt -o namazu.mo ja.po
# cp namazu.mo /usr/local/share/locale/ja/LC_MESSAGES/

namazu-2.0.4/src/output.c

最終手段は、ソースoutput.cを書き換えてnamazu.cgiをコンパイルし直す。 output.cは、namazu.moとの連携を考慮して修正しないと、日本語表示にならなくなる箇所があるので注意。 また、フォームのタグを修正するなら、form.cあたりも修正する。

# cd namazu-2.0.4/src
*.cを修正
# cd ..
# make clean
# make
# make install

[サーバの実験室 Redhat/Fedora]