日本語全文検索システム Namazu の導入
Namazu とは、指定されたファイル群の中から任意のキーワードで検索が出来るシステムです。
CGI として動作させ WEB ページ内の検索はもちろんの事、Microsoft Word や Excel 、PDF の内容も検索対象にする事が可能です。
Namazu の特徴は、あらかじめインデックスと言うファイルを作成しておき、そのインデックスにキーワードと、そのキーワードを含むファイル名の対応関係が記述されています。
このインデックスファイルを検索する事により高速で、低負荷な全文検索が可能になります。
当サイトの「 BBS 過去ログ集 」では、様々な問題に対する解決方法やアドバイスが記載されており、
その情報を素早く探し出していただく為に Namazu の導入を決意しました。
ページ内コンテンツ一覧
Namazu には Namazu 本体と、ファイル内キーワードの「わかち書き」(単語切り出し)を行う KAKASI と言うソフトウェアが必要になります。
私の環境下( Vine Linux 2.6 )では、Namazu 、KAKASI 関連のパッケージは全てインストールされていました。 以下のコマンドでインストールされているかを確認して下さい。
# rpm -qa | grep namazu
# rpm -qa | grep kakasi
インストールされていたらそのパッケージをアップデートしましょう。
apt コマンドを使用すれば依存関係などを意識する事なくアップデートしてくれます。
# apt-get update <-- apt 用のデータベースの更新
# apt-get install namazu <-- Namazu がなければインストール。あればアップデート
# apt-get install kakasi <-- KAKASI がなければインストール。あればアップデート
重要な事ですが、namazu.cgi と .namazurc 及び namazurc と言うファイルの存在を確認して下さい。
(私の環境( Vine Linux 2.6 )では元々インストールされていましたので、新規でインストールする場合の手順がイマイチ分かりません)
ファイルの検索には以下のコマンドで可能です。
# updatedb <-- locate コマンド用データベースの更新
# locate namazu.cgi
# locate .namazurc
Vine Linux2.6 のデフォルトでは /home/httpd/cgi-bin/ ディレクトリ内に両方ありました。
いよいよインデックスファイルの作成に入ります。
インデックスファイルの作成には mknmz と言うコマンドを使用します。
ここからはサーバ管理者の好みによってインデックス化したいファイル群とインデックス化したくないファイル群が発生してくると思うので、「基本編」と「応用編」に分けました。
「基本編」では、ドキュメントルート内の全てのファイル群をインデックス化する、最も基本的なインデックスファイルの作成方法を紹介します。
まずは、インデックスファイルを格納するディレクトリを作成します。
これはドキュメントルート内でなくても構いません。どこでもいいんです。
私は余計なディレクトリはドキュメントルート内に置きたくなかったので、/home/httpd/ ディレクトリ内に設置しました。
# cd /home/httpd
# mkdir namazu
# cd ./namazu
# mkdir index <-- この中にインデックスファイルを作成します。
次に実際にインデックスファイルを作成します。
インデックスファイルの作成には mknmz コマンドを使用します。
一般的な書式は以下の通りです。
mknmz --output-dir=出力先のパス インデックス化するファイルが格納されているパス
上記、「 --output-dir=出力先のパス 」は省略可能ですが、その場合はカレントディレクトリ内にインデックスが作成されます。
実際のコマンドは以下の様になります。
# mknmz --output-dir=/home/httpd/namazu/index /home/httpd/html
上記のコマンドは「 /home/httpd/html/ 」ディレクトリ以下の HTML ファイルを全て、「 /home/httpd/namazu/index 」ディレクトリ内にインデックス化するコマンドです。
コマンド実行後、以下の様なメッセージが表示されればインデックスの作成は正常に終了した事を表しています。
検索対象のファイルを調べています... 5個のファイルがインデックス作成の対象として見つかりました 1/5 - /home/httpd/html/aaa.html [text/html] ・・・ 5/5 - /home/httpd/html/bbb.html [text/html] インデックスを書き出しています... [基本] 日付: Thu May 29 11:55:33 2003 追加された文書の数: 5 サイズ (bytes): 61,950 合計の文書数: 5 追加キーワード数: 1,679 合計キーワード数: 1,679 わかち書き: module_kakasi -ieuc -oeuc -w 経過時間 (秒): 50 ファイル/秒: 0.10 システム: linux Perl: 5.006001 Namazu: 2.0.12
「基本編」では全ての文章に対してインデックス化を行いましたが、実際の運用には検索対象としてインデックスを複数用意したい、このディレクトリは検索させたくない、等の条件が発生してくると思います。
ここでは、当サイトの検索の条件に準えて説明します。
以下に前提条件を示します。
パス | インデックス化 | インデックスファイルの格納パス | 内容 |
/home/httpd/html/ | する | /home/httpd/namazu/index/web/ | ドキュメントルート。 全ての公開コンテンツが格納されている。 BBS 過去ログ集は含まない。 |
/home/httpd/html/bbs/ | する | /home/httpd/namazu/index/bbs/ | BBS の過去ログ集が格納されているディレクトリ。 |
/home/httpd/html/private/ | しない | - | 外部に公開していない HTML ファイルが格納されている。 |
/home/httpd/cgi-bin/ | しない | - | 動的コンテンツである CGI ファイルが格納されているディレクトリ |
/home/httpd/html/image/ | しない | - | 画像ファイルが格納されているディレクトリ。 |
当サイトでは、通常の WEB ページと掲示板の過去ログの HTML を区別しています。
これは別々のインデックスを用意しています。これにより、WEB ページ内のみで検索する、過去ログのみで検索する、と言った事が可能になります。
具体的には、インデックスファイルを格納するディレクトリを複数用意し、そのディレクトリ内に対象のディレクトリのインデックスを作成してやれば良いのです。
インデックスファイルを格納するディレクトリ構成を以下に示します。
/home/httpd/namazu +-- index <-- Namazu のインデックスを格納するディレクトリ +-- web <-- WEB ページのみのインデックスを格納する +-- bbs <-- BBS 過去ログのみのインデックスを格納する
既に /home/httpd/namazu/index ディレクトリは存在するものとして、 /home/httpd/namazu/index/ 内に web ディレクトリと bbs ディレクトリを以下のコマンドで作成します。
[root@hostname index]# mkdir web
[root@hostname index]# mkdir bbs
下準備が完了したので、実際にインデックスファイルを作成します。
この際にドキュメントルートのインデックスファイルを作成の際には、除外するディレクトリがありますので、 mknmz コマンドに除外ディレクトリを指定すべく --exclude オプションを付けて実行します。
コマンドの実行例は以下の様になります。
# mknmz --output-dir=/home/httpd/namazu/index/web --exclude="(img|bbs|cgi-bin)" /home/httpd/html
# mknmz --output-dir=/home/httpd/namazu/index/bbs --exclude="(img|cgi-bin)" /home/httpd/html/bbs
上記コマンド実行後、それぞれのディレクトリにインデックスが格納されているハズですので、確認して下さい。
(基本編を含め)インデックスファイルは常に最新のモノを利用しないと意味がありません。
BBS の過去ログなど、動的に生成される WEB ページは管理者がいちいち mknmz コマンドを作成するのは面倒ですよね。
そこで、mknmz コマンドを定期的に実行させる為に cron を利用します。
この cron による mknmz コマンドの実行方法はこのページの「インデックス作成を Cron に登録」で解説していますので、ご一読下さい。
cron に関して 2003/06/09 編集
ここまでの設定で、Namazu は動作します。
基本的な動作確認として、ターミナル上から検索してみましょう。
コマンドの簡単な書式は以下の通りです。
# namazu [キーワード] [インデックスファイルへのフルパス]
上記コマンドの書式を踏まえて、実際に検索してみます。
これは、動作確認ですので、「検索結果が表示されるか」という事だけに焦点を絞る為に実施します。
# namazu Linux /home/httpd/namazu/index/web
上記コマンドは「 Linux 」をキーワードに、 /home/httpd/namazu/index/web 内のインデックスを検索します。
以下の様な検索結果が表示されれば問題ありません。
検索結果 参考ヒット数: [ Linux: 47 ] 検索式にマッチする 47 個の文書が見つかりました。 1. リンク - Linux で自宅サーバ [ Home Server Technical. ] (スコア: 127) 著者: exampleuser@example.com 日付: Tue, 15 Apr 2003 22:53:08 Linux で自宅サーバ [ Home Server Techncial ] トップページに戻る 当サイトはリンク フリー! 当サイトはリンクフリーもフリー、どフリーです。リンク張って下さる方、大歓 迎します!どしどし張ってくれたらとって /home/httpd/html/link.html (18,693 bytes) ・・・( 途中省略 ) ・・・ 20. Procmail でメールフィルタ - Linux で自宅サーバ [ Home Server Technical. ] ( スコア: 87) 著者:exampleuser@example.com 日付: Tue, 15 Apr 2003 22:53:08 Linux で自宅サーバ [ Home Server Techncial ] トップページに戻る Procmail でメー ルフィルタ このページは、メールサーバである、Postfix のインストール及び設定が完 了し、実際に運用している事を前提としてい /home/httpd/html/procmail.html (10,307 bytes) 現在のリスト: 1 - 20
WEB ページ上で動作させる場合には、namazu.cgi を CGI が動作するディレクトリに設置しなければなりません。
また、Namazu の個別設定ファイル(私は .htaccess の様なモノと認識)である .namazurc を同じディレクトリに設置しなければなりません。
ディストリビューションによっては、ドキュメントルートに namazu.cgi があるとは限りませんので、事前に locate コマンド等で確認しておいて下さい。
Vine の場合は /home/httpd/cgi-bin/ ディレクトリ内に namazu.cgi も .namazurc も設置してあります。
namazu.cgi が目的のディレクトリに無い場合には、2つの設置方法があります。
シンボリックリンクを貼る場合
以下のコマンドを実行し、シンボリックリンクを貼ります。
ただし、namazu.cgi の設置元で CGI が実行可能な場合にのみシンボリックリンクが利用可能です!
# ln -s /usr/local/libexec/namazu.cgi /home/httpd/cgi-bin/
簡単な書式
# ln -s [namazu.cgiがある場所] [実際にCGIが動作する場所]
namazu.cgi をコピーする場合
以下のコマンドを実行し、namazu.cgiをコピーします。
コピーした場合は、Namazu のアップデート毎にコピーし直してやらなければ正常に動作しませんので注意が必要です!
# cp /usr/local/libexec/namazu.cgi /home/httpd/cgi-bin/
簡単な書式
# cp [namazu.cgiがある場所] [実際にCGIが動作する場所]
次に .namazurc についてですが、.namazurc がどこかにあればそれをコピーします。
エディタで開くと、幾つかの設定が記述されていますので、それを自分の環境に合わせて書き換えます。
# インデックスファイルが格納されている場所 Index /home/httpd/namazu/index # Namazu の表示様式が格納されているディレクトリ # 取りあえず、インデックスファイルが格納されているディレクトリを指定します。 # 詳しくは次項で解説します。 Template /home/httpd/namazu/index/web # 検索結果を URL に変換する場合に使用します。 Replace /home/httpd/html http://www.miloweb.net # 日本語を指定します。 Lang ja_JP.eucJP
これで、Namazu の基本的な設定は完了です。
次は WEB ページに検索フォームの設置を行います。
以下の例は複数のインデックスファイルがある場合を前提として記述しています。
<form action="./cgi-bin/namazu.cgi" method="GET">
<b>サイト内検索:</b>
<input type="text" name="query" size="20">
<input type="submit" value="検索">
<input type="hidden" name="whence" value="0">
<input type="hidden" name="max" value="20">
<input type="hidden" name="result" value="normal">
<input type="hidden" name="sort" value="score">
<input type="hidden" name="idxname" value="web,bbs"> 注意
</form>
注意:複数インデックスファイルがある場合は、対象のインデックスが格納されているディレクトリ名をカンマ区切りで指定します
上記のタグを HTML 内に記述してやると検索フォームが表示されます。
設置した検索フォームから検索してみて下さい。
ターミナル上から行った動作確認と同様の検索結果が得られれば、Namazu の動作は正常です。
当サイトの様にインデックスファイルが複数ある場合には、若干の追加設定が必須です。
次項の「検索結果のカスタマイズ」と併せてご覧下さい。
インデックスファイルが複数ある場合は、検索対象をユーザに指定させなければなりません。
その記述を行っているのが、「 NMZ.head.ja 」と言うファイルです。
NMZ.head.ja はインデックスファイルを作成したディレクトリに自動的に生成されますので、エディタで開き、以下の部分を自分の環境に合わせて編集します。
該当箇所は、NMZ.head.ja の 80 行目付近になります。デフォルトではコメントアウトされています。
<p>
<strong>検索対象:</strong>
<input type="checkbox" name="idxname" value="web" checked>WEB ページ
<input type="checkbox" name="idxname" value="bbs" checked>BBS 過去ログ集
</p>
input タグの name 属性には「 idxnama 」を指定します。
value 属性には個々のインデックスファイルが格納されているディレクトリ名を指定します。
この時、.namazurc の Index の値には web , bbs ディレクトリが格納されているディレクトリ(つまり /home/httpd/namazu/index)を指定しなければなりません。
Namazu の検索結果などの HTML は、そのほとんどをサーバ管理者の好みに変更してやる事が可能です。
その検索結果の HTML は、先ほどの .namazurc で指定した「 Template 」の値によって決定されます。
管理を単純にする為に、表示形式を受け持つファイルを格納するディレクトリを作成します。
例として、/home/httpd/namazu/template と言うディレクトリを作成します。
そして、その template ディレクトリ内に下記テーブル内のファイルを /home/httpd/namazu/index/web/ など、インデックスファイルが格納されているディレクトリからコピーします。
基本的に、ファイル名が「 NMZ 」から始まり「 ja 」で終わっているファイルが対象となります。
ファイル名 | 用途 |
NMZ.head.ja | HTML のヘッダー部分を受け持つ。 詳細な検索フォームの表示もこのファイルに記述する。 |
NMZ.body.ja | 直接 namazu.cgi が呼び出された時に表示される。 検索方法が記載されている。 |
NMZ.foot.ja | Namazu 関連のページの最下部に全てこのファイルの記述が表示される。 |
NMZ.result.normal.ja | 検索結果の表示形式が「標準」モードの時に、検索結果をどう表示するかを記述する。 |
NMZ.result.short.ja | 検索結果の表示形式が「簡潔」モードの時に、検索結果をどう表示するかを記述する。 |
NMZ.tips.ja | 検索の結果、該当記事が1件も無い場合に表示される、「検索のコツ」。 |
これらのファイルを、/home/httpd/namazu/template に格納し、.namazurc の「 Template 」の値を「 /home/httpd/namazu/template 」に変更します。
NMZ.****.ja ファイルを Windows 環境から Linux 環境へ FFFTP などでアップする場合は、ホストの文字コードに「 EUC 」を指定しなければなりません。
デフォルトでは、検索結果で表示される項目の一部が英語のままになっている可能性があります(「 Results: 」や「 Total 999 documents matching your query. 」など)。
これを日本語にしたい場合は、/etc/namazu/namazurc の Lang 設定に「 ja_JP.eucJP 」を指定してやれば日本語になります。
テンプレートファイルを別で用意する場合の注意点
本来なら、NMZ.head.ja には「インデックスの最終更新日」として日付が入ります。
インデックスファイルと同じディレクトリにある NMZ.head.ja を使用する際には正常に日付が上書きされますが、
ここで解説した様に、別でテンプレートファイルをまとめた場合には上書きされません。
mknmz コマンドのオプションで --template-dir=DIR を付加してもダメでした。
どなたか対処法をご存知の方がいらっしゃいましたらご連絡頂けると幸いです。
これら全ての Namazu インデックスファイル、及びテンプレートファイルのディレクトリ構成は以下の様になりました。
/home/httpd/namazu +-- index <-- Namazu のインデックスを格納するディレクトリ | +-- web <-- WEB ページのみのインデックスを格納する | +-- bbs <-- BBS 過去ログのみのインデックスを格納する +-- template <-- 表示様式(テンプレート)ファイルを格納するディレクトリ
検索すべきインデックスファイルを常に最新のモノに保つためには、定期的にインデックスファイル作成コマンドである mknmz コマンドを実行してやらなければなりません。
Linux で「定期的に実行」と言うと cron を利用します。
この cron に直接 mknmz コマンドを実行する様に記述すると、一応インデックスファイルは作成されますが、検索結果が文字化けします。
これを回避する為には、 mknmz コマンドを記述したシェル・スクリプトを作成し、そのスクリプトを cron で実行してやらなければなりません。
と言っても、至極単純なスクリプトですので、安心して下さい。要は、mknmz コマンドを予め一つのファイルにまとめるだけです。
では、実際にシェル・スクリプトを下記に示します。
保存する場所はどこでもいいですが、ここでは、/usr/local ディレクトリ内に保存します。
ファイル名は「 namazu-index.sh 」とします。
#!/bin/bash
export LANG=ja_JP.eucJP
export PEAL_BADLANG=0
/usr/bin/mknmz --output-dir=/home/httpd/namazu/index/web --exclude="(img|bbs|cgi-bin)" /home/httpd/html
/usr/bin/mknmz --output-dir=/home/httpd/namazu/index/bbs --exclude="(img|cgi-bin)" /home/httpd/html/bbs
namazu-index.sh が作成できたら一度、コンソール上で実行して下さい。
# /usr/local/namazu-index.sh
これで、エラーが無ければ、次はこのスクリプトを cron に登録します。
cron に上記 nknmz コマンドを登録し、定期的に mknmz コマンドを実行してやる必要があります。
cron へ登録は crontab コマンドを使用すると便利です。
「 crontab -e 」コマンドを実行すると vi エディタが起動するので、下記の記入例を参考に mknmz コマンドを追加します。
# crontab -e
以下の内容を記述
0 5 * * * /usr/local/namazu-index.sh
cron 登録の書式
cron は定期的にスクリプトを実行する時に使用しますが、その書式を簡単に説明します。
書式の右から5つの項目はそれぞれ「分」「時」「日」「月」「曜日」を指しています。
その後に実行したいコマンドを記入します。
例えば、毎日午前5時に実行したい場合には以下の様に記述します。
0 5 * * * 実行したいコマンド
記述が終了したら、忘れずに保存します。
これで定期的に namazu-index.sh の内容が実行されます。