CentOS7

サイト内検索システム構築(Namazu)

Googleのようにキーワードを入力して自宅サーバーのWebサイト内を検索することができるようにする。

ここでは、あらかじめ作成しておくインデックスを使用して、高速に検索することができるNamazuでサイト内検索システムを構築する。

なお、検索対象のWebコンテンツは/var/www/html/hogeに格納されているものとする。

NKFコマンドがインストールされていること

Namazuインストール

Namazuに必要なkakasiインストール

[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を削除

Namazuインストール

[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から書き込み権限削除

Namazu設定

mknmzコマンド設定

検索に使用するインデックスを作成する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
# "
.*\\.pdf.*\\.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コマンド設定

インデックスをもとに検索を行う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
footbodytipsresults).de for displaying results
## and use a proper message catalog for `de'.
##
#Lang ja
Lang ja_JP.eucJP ← 追加(検索結果の日本語化)

Namazu確認

インデックス作成

例として、/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/hogenkf -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/hogenkf -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

namazu.cgi設置

Webページ上からNamazuを利用するためのCGI(namazu.cgi)を設置する

[root@localhost ~]# cp /usr/local/libexec/namazu.cgi /var/www/cgi-bin ← namazu.cgiをcgi-binへコピー

namazu.cgi設定

[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検索結果ページフッタファイルを削除

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/)内のファイルのみ検索できるようにしたい場合は、新たにインデックスを作成すればよい。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS