Googleのようにキーワードを入力して自宅サーバーのWebサイト内を検索することができるようにする。
ここでは、あらかじめ作成しておくインデックスを使用して、高速に検索することができるNamazuでサイト内検索システムを構築する。
なお、検索対象のWebコンテンツは/var/www/html/hogeに格納されているものとする。
※NKFコマンドがインストールされていること
[root@localhost ~]# wget http://kakasi.namazu.org/stable/kakasi-2.3.6.tar.gz ← kakasiダウンロード |
※最新版のURLはダウンロードページで確認すること |
[root@localhost ~]# tar zxvf kakasi-2.3.6.tar.gz ← kakasi展開 |
[root@localhost ~]# cd kakasi-2.3.6 ← kakasi展開先ディレクトリへ移動 |
[root@localhost kakasi-2.3.6]# ./configure && make && make install ← kakasiインストール |
[root@localhost kakasi-2.3.6]# cd ← kakasi展開先ディレクトリを抜ける |
[root@localhost ~]# rm -rf kakasi-2.3.6 ← kakasi展開先ディレクトリを削除 |
[root@localhost ~]# rm -f kakasi-2.3.6.tar.gz ← ダウンロードしたkakasiを削除 |
[root@localhost ~]# wget http://www.namazu.org/stable/namazu-2.0.21.tar.gz ← Namazuダウンロード |
※最新版のURLはダウンロードページで確認すること |
[root@localhost ~]# tar zxvf namazu-2.0.21.tar.gz ← Namazu展開 |
[root@localhost ~]# cd namazu-2.0.21/File-MMagic/ ← Namazu同梱のFile::MMagic展開先ディレクトリへ移動 |
[root@localhost File-MMagic]# yum -y install perl-ExtUtils-MakeMaker ← perl-ExtUtils-MakeMakerインストール |
[root@localhost File-MMagic]# perl Makefile.PL && make install ← File::MMagicインストール |
[root@localhost File-MMagic]# cd .. ← Namazu展開先ディレクトリへ移動 |
[root@localhost namazu-2.0.21]# ./configure && make && make install ← Namazuインストール |
[root@localhost namazu-2.0.21]# cd ← Namazu展開先ディレクトリを抜ける |
[root@localhost ~]# rm -rf namazu-2.0.21 ← Namazu展開先ディレクトリを削除 |
[root@localhost ~]# rm -f namazu-2.0.21.tar.gz ← ダウンロードしたNamazuを削除 |
※mknmzコマンドで下記のエラーメッセージが出力される場合の対処⇒参考 defined(@array) is deprecated at /usr/local/share/perl5/File/MMagic.pm line 1122. (Maybe you should just omit the defined()?) |
[root@localhost ~]# chmod +w /usr/local/share/perl5/File/MMagic.pm ← MMagic.pmへ書き込み権限追加 |
[root@localhost ~]# vi /usr/local/share/perl5/File/MMagic.pm ← MMagic.pm編集 |
#elsif (defined @$entry) { ← 行頭に#を追加してコメントアウト elsif (ref $entry eq "ARRAY" and @$entry) { ← 追加 |
[root@localhost ~]# chmod -w /usr/local/share/perl5/File/MMagic.pm ← MMagic.pmから書き込み権限削除 |
検索に使用するインデックスを作成するmknmzコマンドを設定する
[root@localhost ~]# cp /usr/local/etc/namazu/mknmzrc-sample /usr/local/etc/namazu/mknmzrc ← サンプルより設定ファイルコピー |
[root@localhost ~]# vi /usr/local/etc/namazu/mknmzrc ← mknmzコマンド設定ファイル編集 |
# $ALLOW_FILE = ".*\\.(?:$HTML_SUFFIX) | .*\\.txt" . # HTML, plain text # " | .*\\.gz | .*\\.Z | .*\\.bz2" . # Compressed files # " | .*\\.ps" . # PDF, PostScript # " | .*\\.tex | .*\\.dvi" . # TeX, DVI # " | .*\\.rpm | .*\\.deb" . # RPM, DEB # " | .*\\.doc | .*\\.xls | .*\\.pp[st]" . # Word, Excel, PowerPoint # " | .*\\.j[sabf]w | .*\\.jtd" . # Ichitaro 4, 5, 6, 7, 8 # " | .*\\.sx[widc]" . # OpenOffice Writer,Calc,Impress,Draw # " | .*\\.rtf" . # Rich Text Format # " | .*\\.hdml" . # HDML # " | .*\\.mp3" . # MP3 # " | \\d+ | [-\\w]+\\.[1-9n]"; # Mail/News, man $ALLOW_FILE = ".*\\.(?:$HTML_SUFFIX)"; ← 追加(HTMLを検索対象にする) ※その他の文書も検索対象にしたい場合は上記コメントを参考に設定を追加する |
[root@localhost ~]# vi /usr/local/bin/mknmz ← mknmzコマンド編集 |
※mknmzコマンドが"Use of uninitialized・・・"というエラーメッセージを出力しないようにする対処 |
#! /usr/bin/perl -w ↓ #! /usr/bin/perl ← -wを削除 |
インデックスをもとに検索を行うnamazuコマンドを設定する
[root@localhost ~]# cp /usr/local/etc/namazu/namazurc-sample /usr/local/etc/namazu/namazurc ← サンプルより設定ファイルコピー |
[root@localhost ~]# vi /usr/local/etc/namazu/namazurc ← namazuコマンド設定ファイル編集 |
## ## Replace: Replace TARGET with REPLACEMENT in URIs in search ## results. ## ## TARGET is specified by Ruby's perl-like regular expressions. ## You can caputure sub-strings in TARGET by surrounding them ## with `(' and `)'and use them later as backreferences by ## \1, \2, \3,... \9. ## ## To use meta characters literally such as `*', `+', `?', ` | ', ## `[', `]', `{', `}', `(', `)', escape them with `\'. ## ## e.g., ## ## Replace /home/foo/public_html/ http://www.foobar.jp/~foo/ ## Replace /home/(.*)/public_html/ http://www.foobar.jp/\1/ ## Replace /C\ | /foo/ http://www.foobar.jp/ ## ## If you do not want to do the processing on command line use, ## run namazu with -U option. ## ## You can specify more than one Replace rules but the only ## first-matched rule are applied. ## #Replace /home/foo/public_html/ http://www.foo.bar.jp/~foo/ Replace /var/www/html/hoge/ http://hoge.com/ ← 追加(/var/www/html/hoge/をhttp://hoge.com/に置換する例) ## ## Lang: Set the locale code such as `ja_JP.eucJP', `ja_JP.SJIS', ## `de', etc. This directive works only if the environment ## variable LANG is not set because the directive is mainly ## intended for CGI use. On the shell, You can set ## environemtnt variable LANG instead of using the directive. ## ## If you set `de' to it, namazu.cgi use ## NMZ.(head | foot | body | tips | results).de for displaying results ## and use a proper message catalog for `de'. ## #Lang ja Lang ja_JP.eucJP ← 追加(検索結果の日本語化) |
例として、/var/www/html/hogeのインデックスを/usr/local/var/namazu/index/hogeに作成する
[root@localhost ~]# mkdir /usr/local/var/namazu/index/hoge ← インデックス作成先ディレクトリ作成 |
[root@localhost ~]# mknmz /var/www/html/hoge -O /usr/local/var/namazu/index/hoge | nkf -w ← インデックス作成 |
&color(lightpink){※最後の「 | nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する}; 検索対象のファイルを調べています... 4個のファイルがインデックス作成の対象として見つかりました 1/4 - /var/www/html/hoge/index.html [text/plain] 2/4 - /var/www/html/hoge/virtual/index.html [text/plain] 3/4 - /var/www/html/hoge/virtual/usage/index.html [text/html] 4/4 - /var/www/html/hoge/virtual/usage/usage_200511.html [text/html] インデックスを書き出しています... [基本] 日付: Sat Nov 26 00:34:46 2005 追加された文書の数: 4 サイズ (bytes): 48,802 合計の文書数: 4 追加キーワード数: 293 合計キーワード数: 293 わかち書き: /usr/local/bin/kakasi -ieuc -oeuc -w 経過時間 (秒): 5 ファイル/秒: 0.80 システム: linux Perl: 5.008005 Namazu: 2.0.14 |
[root@localhost ~]# namazu test /usr/local/var/namazu/index/hoge | nkf -w ← testというキーワードで検索してみる |
&color(lightpink){※最後の「 | nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する}; 検索結果 参考ヒット数: [ test: 1 ] 検索式にマッチする 1 個の文書が見つかりました。 1. index.html (スコア: 2) 著者: 不明 日付: Tue, 22 Nov 2005 17:09:40 test http://hoge.com/index.html (5 bytes) 現在のリスト: 1 - 1 |
Webページ上からNamazuを利用するためのCGI(namazu.cgi)を設置する
[root@localhost ~]# cp /usr/local/libexec/namazu.cgi /var/www/cgi-bin ← namazu.cgiをcgi-binへコピー |
[root@localhost ~]# nkf -w /usr/local/var/namazu/index/hoge/NMZ.head.ja>NMZ.head.ja ← namazu.cgi検索結果ページヘッダファイルをUTF-8に変換 |
※システムの文字コードがUTF-8の場合のみ |
[root@localhost ~]# vi NMZ.head.ja ← namazu.cgi検索結果ページヘッダファイル編集 |
<head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-jp"> ← 追加(NamazuWebインタフェースページの文字化け対処) <!-- <input type="hidden" name="idxname" value="foobar"> --> ↓ <input type="hidden" name="idxname" value="hoge"> ← コメントを解除してインデックス格納ディレクトリ名を指定 <a href="{cgi}">[検索方法]</a> ↓ <a href="{cgi}?idxname=hoge">[検索方法]</a> ← インデックス格納ディレクトリ名を指定 |
[root@localhost ~]# nkf -e NMZ.head.ja>/usr/local/var/namazu/index/hoge/NMZ.head.ja ← 編集したnamazu.cgi検索結果ページヘッダファイルをeucに戻す |
※システムの文字コードがUTF-8の場合のみ |
[root@localhost ~]# rm -f NMZ.head.ja ← UTF-8に変換したnamazu.cgi検索結果ページヘッダファイルを削除 |
※システムの文字コードがUTF-8の場合のみ |
[root@localhost ~]# nkf -w /usr/local/var/namazu/index/hoge/NMZ.foot.ja>NMZ.foot.ja ← namazu.cgi検索結果ページフッタファイルをUTF-8に変換 |
※システムの文字コードがUTF-8の場合のみ |
[root@localhost ~]# vi NMZ.foot.ja ← namazu.cgii検索結果ページフッタファイル編集 |
この全文検索システムは <strong><a href="http://www.namazu.org/">Namazu</a> <!-- VERSION --> v2.0.14 <!-- VERSION --></strong> ↓ <strong><a href="http://www.namazu.org/">Namazu</a></strong> ← Namazuバージョン情報表示部分削除 以下の全行を削除(管理人メールリンク非表示化) <address> <!-- ADDRESS --> <a href="mailto:webmaster@extras64">webmaster@extras64</a> <!-- ADDRESS --> </address> |
[root@localhost ~]# nkf -e NMZ.foot.ja>/usr/local/var/namazu/index/hoge/NMZ.foot.ja ← 編集したnamazu.cgi検索結果ページフッタファイルをeucに戻す |
※システムの文字コードがUTF-8の場合のみ |
[root@localhost ~]# rm -f NMZ.foot.ja ← UTF-8に変換したnamazu.cgi検索結果ページフッタファイルを削除 |
http://サーバー名/cgi-bin/namazu.cgi?idxname=hogeにアクセスして「Namazu による全文検索システム」というページが表示されるので、キーワードを入れて検索してみる。
※idxname=hogeのhogeの部分は、インデックス作成先ディレクトリ名(ここでは/usr/local/var/namazu/index/hoge/なのでhoge)を指定する
[root@localhost ~]# vi mknmz.sh ← mknmz実行スクリプト作成 |
#!/bin/bash # # Namazuインデックス作成汎用スクリプト # # 使い方: mknmz.sh $1 $2 [$3] # $1: インデックス作成対象ディレクトリ名[省略不可] # $2: インデックス作成先ディレクトリ名[省略不可] # $3: インデックス作成対象外ディレクトリ/ファイルリスト名[省略可] # PATH=/usr/local/bin:/usr/bin:/bin # インデックス作成対象ディレクトリ名を引数より取得 if [ -d $1 ]; then DOC=$1 else echo "Usage: $0 Directory Index [ExcludeDirectoryList]" exit 1 fi # インデックス作成先ディレクトリ名を引数より取得 if [ -d $2 ]; then IDX=$2 else echo "Usage: $0 Directory Index [ExcludeDirectoryList]" exit 1 fi # ロックファイル残存対処 if [ -f ${IDX}NMZ.lock2 ]; then ps `cat ${IDX}NMZ.lock2` > /dev/null 2>&1 [ $? -ne 0 ] && rm -f ${IDX}NMZ.lock2 fi # インデックス作成対象外ディレクトリ名を引数より取得 if [ $# -eq 3 ] && [ -f $3 ]; then for exclude in `cat $3` do NOTDOC="$NOTDOC$exclude | " done NOTDOC=`echo $NOTDOC | sed 's/ | $//g'` fi # システム文字コード退避 SYSTEM_LANG=`echo $LANG` # システム文字コードをeucにする export LANG=ja_JP.eucJP # インデックス作成 TEMP_LOG=`mktemp` if [ $# -eq 3 ] && [ -f $3 ]; then mknmz $DOC -O $IDX --exclude="$NOTDOC" > $TEMP_LOG else mknmz $DOC -O $IDX > $TEMP_LOG fi # ログ出力 if [ "$SYSTEM_LANG" = "ja_JP.UTF-8" ]; then nkf -w $TEMP_LOG | logger -t mknmz else cat $TEMP_LOG | logger -t mknmz fi rm -f $TEMP_LOG # 月曜日はインデックスの最適化(不要データの掃除)も行う [ $(date +%w) = "1" ] && gcnmz -qb $IDX |
[root@localhost ~]# chmod 700 mknmz.sh ← mknmz実行スクリプトに実行権限付加 |
[root@localhost ~]# crontab -e ← cron編集 |
00 00 * * * /root/mknmz.sh /var/www/html/hoge/ /usr/local/var/namazu/index/hoge/ ← 追加(毎日00:00にmknmz実行スクリプトを実行する) |
※インデックス作成対象ディレクトリ内で、インデックス作成対象外にしたいディレクトリまたはファイルがある場合 |
[root@localhost ~]# echo "/var/www/html/hoge/exclude/" >> mknmz.exclude ← /var/www/html/hoge/exclude/をインデックス作成対象外リストに追加 |
[root@localhost ~]# echo "/var/www/html/hoge/excludefile.*" >> mknmz.exclude ← /var/www/html/hoge/excludefile.*をインデックス作成対象外リストに追加 |
[root@localhost ~]# ./mknmz.sh /var/www/html/hoge/ /usr/local/var/namazu/index/hoge/ mknmz.exclude ← インデックス作成対象外リストを指定してmknmz実行スクリプト実行 |
これで、毎日00:00に自動的にインデックスを更新するようになる。また、mknmzの実行結果は/var/log/messagesに保存される。
namazuによる検索結果ページは以下のファイル(中身はHTML)を編集することによって、デザインを自由に変更することができる。
変更箇所 | 編集ファイル |
ヘッダ部 | /usr/local/var/namazu/index/NMZ.head.ja |
フッタ部 | /usr/local/var/namazu/index/NMZ.foot.ja |
検索結果部(標準版) | /usr/local/var/namazu/index/NMZ.result.normal.ja |
検索結果部(簡潔版) | /usr/local/var/namazu/index/NMZ.result.short.ja |
検索方法部 | /usr/local/var/namazu/index/NMZ.body.ja |
検索ヒント部 | /usr/local/var/namazu/index/NMZ.tips.ja |
既に作成済であるサイト内の全ファイル(例:/var/www/html/hoge)を検索できるページのほかに、サイト内の特定ディレクトリ(例:/var/www/html/hoge/bbshtml/)内のファイルのみ検索できるようにしたい場合は、新たにインデックスを作成すればよい。