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

最終更新日: 2014.02.19

<<トップページ <<新着情報 <<サイト内検索 <<CentOSで自宅サーバー構築 <<Scientific Linuxで自宅サーバー構築

■概要

Googleのようにキーワードを入力して自宅サーバーのWebサイト内を検索することができるようにする。
ここでは、あらかじめ作成しておくインデックスを使用して、高速に検索することができるNamazuでサイト内検索システムを構築する。
なお、検索対象のWebコンテンツは/var/www/html/fedoraに格納されているものとする。


■Namazuインストール

先にnkfコマンドをScientific Linux 6インストール&初期設定の「(9)nkfコマンドインストール」を参考にしてインストールしておくこと

(1)Namazuに必要なkakasiインストール
[root@fedora ~]# yum -y install kakasi-dict ← インデックス作成で必要なkakasi-dictインストール

(2)Namazuインストール
[root@fedora ~]# wget http://www.namazu.org/stable/namazu-2.0.21.tar.gz ← Namazuダウンロード

※最新版のURLはダウンロードページで確認すること

[root@fedora ~]# tar zxvf namazu-2.0.21.tar.gz ← Namazu展開

[root@fedora ~]# cd namazu-2.0.21/File-MMagic/ ← Namazu同梱のFile::MMagic展開先ディレクトリへ移動

[root@fedora File-MMagic]# yum -y install perl-ExtUtils-MakeMaker ← perl-ExtUtils-MakeMakerインストール

[root@fedora File-MMagic]# perl Makefile.PL && make install ← File::MMagicインストール

[root@fedora File-MMagic]# cd .. ← Namazu展開先ディレクトリへ移動

[root@fedora namazu-2.0.21]# ./configure && make && make install ← Namazuインストール

[root@fedora namazu-2.0.21]# cd ← Namazu展開先ディレクトリを抜ける

[root@fedora ~]# rm -rf namazu-2.0.21 ← Namazu展開先ディレクトリを削除

[root@fedora ~]# rm -f namazu-2.0.21.tar.gz ← ダウンロードしたNamazuを削除

■Namazu設定

(1)mknmzコマンド設定
検索に使用するインデックスを作成するmknmzコマンドを設定する
[root@fedora ~]# cp /usr/local/etc/namazu/mknmzrc-sample /usr/local/etc/namazu/mknmzrc ← サンプルより設定ファイルコピー

[root@fedora ~]# 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@fedora ~]# vi /usr/local/bin/mknmz ← mknmzコマンド編集
※mknmzコマンドが"Use of uninitialized・・・"というエラーメッセージを出力しないようにする対処
#! /usr/bin/perl -w
↓
#! /usr/bin/perl ← -wを削除

(2)namazuコマンド設定
インデックスをもとに検索を行うnamazuコマンドを設定する
[root@fedora ~]# cp /usr/local/etc/namazu/namazurc-sample /usr/local/etc/namazu/namazurc ← サンプルより設定ファイルコピー

[root@fedora ~]# 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/fedorasrv.com/   http://fedorasrv.com/ ← 追加(/var/www/html/fedorasrv.com/をhttp://fedorasrv.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 ← 追加(検索結果の日本語化)

■Namazu確認

(1)インデックス作成
例として、/var/www/html/fedoraのインデックスを/usr/local/var/namazu/index/fedoraに作成する
[root@fedora ~]# mkdir /usr/local/var/namazu/index/fedora ← インデックス作成先ディレクトリ作成

[root@fedora ~]# mknmz /var/www/html/fedora -O /usr/local/var/namazu/index/fedora|nkf -w ← インデックス作成
※最後の「|nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する
検索対象のファイルを調べています...
4個のファイルがインデックス作成の対象として見つかりました
1/4 - /var/www/html/fedora/index.html [text/plain]
2/4 - /var/www/html/fedora/virtual/index.html [text/plain]
3/4 - /var/www/html/fedora/virtual/usage/index.html [text/html]
4/4 - /var/www/html/fedora/virtual/usage/usage_200511.html [text/html]
インデックスを書き出しています...
[基本]
日付:                Mon Apr 10 12:38:07 2006
追加された文書の数:  24
サイズ (bytes):      210,205
合計の文書数:        24
追加キーワード数:    472
合計キーワード数:    472
わかち書き:          module_kakasi -ieuc -oeuc -w
経過時間 (秒):       21
ファイル/秒:         1.14
システム:            linux
Perl:                5.008008

Namazu:              2.0.15

※mknmzコマンドで以下のエラーメッセージが出力される場合の対処
sh: no: command not found
[root@fedora ~]# rpm -q nkf ← nkfインストール確認
nkf-2.0.8b-1.fc9

[root@fedora ~]# yum -y install nkf ← nkfインストール※インストールされていない場合

[root@fedora ~]# vi /etc/namazu/mknmzrc ← mknmz設定ファイル編集
# $NKF = "no";
↓
$NKF = "/usr/bin/nkf"; ← nkfコマンドパスを指定

(2)インデックスをもとに検索
[root@fedora ~]# namazu test /usr/local/var/namazu/index/fedora|nkf -w ← testというキーワードで検索してみる
※最後の「|nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する
検索結果

参考ヒット数:  [ test: 1 ]

検索式にマッチする 1 個の文書が見つかりました。

1. index.html (スコア: 2)
著者: 不明
日付: Tue, 22 Nov 2005 17:09:40
test
http://fedorasrv.com/index.html (5 bytes)



現在のリスト: 1 - 1

■namazu.cgi設置

Webページ上からNamazuを利用するためのCGI(namazu.cgi)を設置する
[root@fedora ~]# cp /usr/local/libexec/namazu.cgi /var/www/cgi-bin ← namazu.cgiをcgi-binへコピー

■namazu.cgi設定

[root@fedora ~]# nkf -w /usr/local/var/namazu/index/fedora/NMZ.head.ja>NMZ.head.ja
 ← namazu.cgi検索結果ページヘッダファイルをUTF-8に変換
※システムの文字コードがUTF-8の場合のみ

[root@fedora ~]# 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="fedora"> ← コメントを解除してインデックス格納ディレクトリ名を指定

<a href="{cgi}">[検索方法]</a>
↓
<a href="{cgi}?idxname=fedora">[検索方法]</a> ← インデックス格納ディレクトリ名を指定

[root@fedora ~]# nkf -e NMZ.head.ja>/usr/local/var/namazu/index/fedora/NMZ.head.ja
 ← 編集したnamazu.cgi検索結果ページヘッダファイルをeucに戻す
※システムの文字コードがUTF-8の場合のみ

[root@fedora ~]# rm -f NMZ.head.ja ← UTF-8に変換したnamazu.cgi検索結果ページヘッダファイルを削除
※システムの文字コードがUTF-8の場合のみ

[root@fedora ~]# nkf -w /usr/local/var/namazu/index/fedora/NMZ.foot.ja>NMZ.foot.ja
 ← namazu.cgi検索結果ページフッタファイルをUTF-8に変換
※システムの文字コードがUTF-8の場合のみ

[root@fedora ~]# vi NMZ.foot.ja ← namazu.cgii検索結果ページフッタファイル編集
この全文検索システムは
<strong><a href="http://www.namazu.org/">Namazu</a> <!-- VERSION --> v2.0.15 <!-- 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@fedora ~]# nkf -e NMZ.foot.ja>/usr/local/var/namazu/index/fedora/NMZ.foot.ja
 ← 編集したnamazu.cgi検索結果ページフッタファイルをeucに戻す
※システムの文字コードがUTF-8の場合のみ

[root@fedora ~]# rm -f NMZ.foot.ja ← UTF-8に変換したnamazu.cgi検索結果ページフッタファイルを削除
※システムの文字コードがUTF-8の場合のみ

■namazu.cgi確認

http://サーバー名/cgi-bin/namazu.cgi?idxname=fedoraにアクセスして「Namazu による全文検索システム」というページが表示されるので、キーワードを入れて検索してみる。

※idxname=fedoraのfedoraの部分は、インデックス作成先ディレクトリ名(ここでは/usr/local/var/namazu/index/fedora/なのでfedora)を指定する

■インデックス更新自動化

[root@fedora ~]# 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@fedora ~]# chmod 700 mknmz.sh ← mknmz実行スクリプトに実行権限付加

[root@fedora ~]# echo "0 3 * * * root /root/mknmz.sh /var/www/html/fedora/ /usr/local/var/namazu/index/fedora/" > /etc/cron.d/mknmz ← mknmz定期自動実行設定追加
※毎日00:00にmknmz実行スクリプトを実行する

※インデックス作成対象ディレクトリ内で、インデックス作成対象外にしたいディレクトリまたはファイルがある場合
[root@fedora ~]# echo "/var/www/html/fedora/exclude/" >> mknmz.exclude ← /var/www/html/fedora/exclude/をインデックス作成対象外リストに追加

[root@fedora ~]# echo "/var/www/html/fedora/excludefile.*" >> mknmz.exclude ← /var/www/html/fedora/excludefile.*をインデックス作成対象外リストに追加

[root@fedora ~]# ./mknmz.sh /var/www/html/fedora/ /usr/local/var/namazu/index/fedora/ mknmz.exclude
 ← インデックス作成対象外リストを指定してmknmz実行スクリプト実行
これで、毎日00:00に自動的にインデックスを更新するようになる。また、mknmzの実行結果は/var/log/messagesに保存される。

■検索結果ページのデザイン変更

namazuによる検索結果ページは以下のファイル(中身はHTML)を編集することによって、デザインを自由に変更することができる。
変更箇所編集ファイル
ヘッダ部NMZ.head.ja
フッタ部NMZ.foot.ja
検索結果部(標準版)NMZ.result.normal.ja
検索結果部(簡潔版)NMZ.result.short.ja
検索方法部NMZ.body.ja
検索ヒント部NMZ.tips.ja


■特定ディレクトリのみのサイト内検索

既に作成済であるサイト内の全ファイル(例:/var/www/html/fedora)を検索できるページのほかに、サイト内の特定ディレクトリ(例:/var/www/html/fedora/bbshtml/)内のファイルのみ検索できるようにしたい場合は、新たにインデックスを作成すればよい。


■関連コンテンツ




▲このページのトップへ戻る

プライバシーポリシー