Namazuによる全文検索システムの設定方法(CentOS Stream 8、Rocky 8)



●必要なソフトウェア

 参考URL:サイト内検索システム構築(Namazu)

 Namazuを動作させるために必要なソフトウェアについては必要なソフトウェアを参照してください。

 ※nkfコマンドがインストールされていない場合、インストールしてください。
※CentOS 8の場合
# dnf --enablerepo=powertools install -y nkf


●Kakashiのインストール

 全文検索システム NamazuよりKakashiの最新版をダウンロードします。
 今回はソースからインストールします。
# cd /usr/local/src
# tar zxvf kakasi-2.3.6.tar.gz ← kakasi展開
# cd kakasi-2.3.6 ← kakasi展開先ディレクトリへ移動
# ./configure && make && make install ← kakasiインストール
# cd .. ← kakasi展開先ディレクトリを抜ける
# rm -rf kakasi-2.3.6 ← kakasi展開先ディレクトリを削除
# rm -f kakasi-2.3.6.tar.gz ← ダウンロードしたkakasiを削除

●Namazuのインストール

# cd /usr/local/src
# tar zxvf namazu-2.0.21.tar.gz ← Namazu展開
# cd namazu-2.0.21/File-MMagic/ ← Namazu同梱のFile::MMagic展開先ディレクトリへ移動
# yum -y install perl-ExtUtils-MakeMaker ← perl-ExtUtils-MakeMakerインストール
# perl Makefile.PL && make install ← File::MMagicインストール
# cd .. ← Namazu展開先ディレクトリへ移動
# ./configure && make && make install ← Namazuインストール
# cd .. ← Namazu展開先ディレクトリを抜ける
# rm -rf namazu-2.0.21 ← Namazu展開先ディレクトリを削除
# 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()?)
# chmod +w /usr/local/share/perl5/File/MMagic.pm ← MMagic.pmへ書き込み権限追加
# vi /usr/local/share/perl5/File/MMagic.pm ← MMagic.pm編集
    #elsif (defined @$entry) { ← 行頭に#を追加してコメントアウト
    elsif (ref $entry eq "ARRAY" and @$entry) { ← 追加
# chmod -w /usr/local/share/perl5/File/MMagic.pm ← MMagic.pmから書き込み権限削除

※Rocky 9の場合
※mknmzコマンドで下記のエラーメッセージが出力される場合の対処⇒参考
defined(@array) is deprecated at /usr/local/share/perl5/File/MMagic.pm line 1122.
(Maybe you should just omit the defined()?)
# chmod +w /usr/local/share/perl5/5.32/File/MMagic.pm ← MMagic.pmへ書き込み権限追加
# vi /usr/local/share/perl5/5.32/File/MMagic.pm ← MMagic.pm編集
    #elsif (defined @$entry) { ← 行頭に#を追加してコメントアウト
    elsif (ref $entry eq "ARRAY" and @$entry) { ← 追加
# chmod -w /usr/local/share/perl5/5.32/File/MMagic.pm ← MMagic.pmから書き込み権限削除


●Namazuの設定

 mknmzコマンド設定

 検索に使用するインデックスを作成するmknmzコマンドを設定します。
# cp /usr/local/etc/namazu/mknmzrc-sample /usr/local/etc/namazu/mknmzrc ← サンプルより設定ファイルコピー
# 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
                "|.*\\.docx|.*\\.xlsx|.*\\.pp[st]x" . # MS-OfficeOpenXML Word, Excel, PowerPoint
                "|.*\\.vs[dst]|.*\\.v[dst]x" .     # Visio
                "|.*\\.j[sabf]w|.*\\.jtd" .        # Ichitaro 4, 5, 6, 7, 8
#               "|.*\\.sx[widc]" .                 # OpenOffice Writer,Calc,Impress,Draw
#               "|.*\\.od[tspg]" .                 # OpenOffice2.0
#               "|.*\\.rtf" .                      # Rich Text Format
#               "|.*\\.hdml|.*\\.mht" .            # HDML MHTML
#               "|.*\\.mp3" .                      # MP3
#               "|.*\\.gnumeric" .                 # Gnumeric
#               "|.*\\.kwd|.*\\.ksp" .             # KWord, KSpread
#               "|.*\\.kpr|.*\\.flw" .             # KPresenter, Kivio
#               "|.*\\.eml|\\d+|[-\\w]+\\.[1-9n]"; # Mail/News, man
$ALLOW_FILE = ".*\\.(?:$HTML_SUFFIX)"; ← 追加(HTMLを検索対象にする)
※その他の文書も検索対象にしたい場合は上記コメントを参考に設定を追加・変更する
# vi /usr/local/bin/mknmz ← mknmzコマンド編集
※mknmzコマンドが"Use of uninitialized・・・"というエラーメッセージを出力しないようにする対処
#! /usr/bin/perl -w

#! /usr/bin/perl ← -wを削除
 詳細については下記を参考にしてください。
#
# This is a Namazu configuration file for mknmz.
#
package conf; # Don't remove this line!

#===================================================================
#
# Administrator's email address
#
# $ADDRESS = 'webmaster@mail.bigbang.mydns.jp';


#===================================================================
#
# Regular Expression Patterns
#

#
# This pattern specifies HTML suffixes.
#
# $HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}";
↑ $HTML_SUFFIXはhtmlやhtm、shtml、html.jaなどhtmlファイルとして認識するファイルを定義しています。

#
# This pattern specifies file names which will be targeted.
# NOTE: It can be specified by --allow=regex option.
# Do NOT use `$' or `^' anchors.
# Case-insensitive.
#
$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
# "|.*\\.docx|.*\\.xlsx|.*\\.pp[st]x" . # MS-OfficeOpenXML Word, Excel, PowerPoint
# "|.*\\.vs[dst]|.*\\.v[dst]x" . # Visio
# "|.*\\.j[sabf]w|.*\\.jtd" . # Ichitaro 4, 5, 6, 7, 8
# "|.*\\.sx[widc]" . # OpenOffice Writer,Calc,Impress,Draw
# "|.*\\.od[tspg]" . # OpenOffice2.0
# "|.*\\.rtf" . # Rich Text Format
# "|.*\\.hdml|.*\\.mht" . # HDML MHTML
# "|.*\\.mp3" . # MP3
# "|.*\\.gnumeric" . # Gnumeric
# "|.*\\.kwd|.*\\.ksp" . # KWord, KSpread
# "|.*\\.kpr|.*\\.flw" . # KPresenter, Kivio
# "|.*\\.eml|\\d+|[-\\w]+\\.[1-9n]"; # Mail/News, man
↑ $ALLOW_FILEはインデックス作成の対象となるファイル形式を定義しています。gzやtex、rpmなどWindowsでは通常お目にかからない拡張子も含まれていますが、すべて#を外してしまっても特に問題はありません。

#
# This pattern specifies file names which will NOT be targeted.
# NOTE: It can be specified by --deny=regex option.
# Do NOT use `$' or `^' anchors.
# Case-insensitive.
#
$DENY_FILE = ".*\\.(gif|png|jpg|jpeg)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*";

#
# This pattern specifies DDN(DOS Device Name) which will NOT be targeted.
# NOTE: Only for Windows.
# Do NOT use `$' or `^' anchors.
# Case-insensitive.
#
# $DENY_DDN = "con|aux|nul|prn|lpt[1-9]|com[1-9][0-9]?|clock\$|xmsxxxx0";
↑ $DENY_FILEはjpegなどのイメージファイルやバックアップファイルなどインデックスを作成しないファイルを指定しています。

#
# This pattern specifies PATHNAMEs which will NOT be targeted.
# NOTE: Usually specified by --exclude=regex option.
#
# $EXCLUDE_PATH = undef;

#
# This pattern specifies file names which can be omitted
# in URI. e.g., 'index.html|index.htm|Default.html'
#
# NOTE: This is similar to Apache's "DirectoryIndex" directive.
#
# $DIRECTORY_INDEX = "";

#
# This pattern specifies Mail/News's fields in its header which
# should be searchable. NOTE: case-insensitive
#
# $REMAIN_HEADER = "From|Date|Message-ID";

#
# This pattern specifies fields which used for field-specified
# searching. NOTE: case-insensitive
#
# $SEARCH_FIELD = "message-id|subject|from|date|uri|newsgroups|to|summary|size";

#
# This pattern specifies meta tags which used for field-specified
# searching. NOTE: case-insensitive
#
# $META_TAGS = "keywords|description";

#
# This pattern specifies aliases for NMZ.field.* files.
# NOTE: Editing NOT recommended.
#
# %FIELD_ALIASES = ('title' => 'subject', 'author' => 'from');

#
# This pattern specifies HTML elements which should be replaced with
# null string when removing them. Normally, the elements are replaced
# with a single space character.
#
# $NON_SEPARATION_ELEMENTS = 'A|TT|CODE|SAMP|KBD|VAR|B|STRONG|I|EM|CITE|FONT|U|'.
# 'STRIKE|BIG|SMALL|DFN|ABBR|ACRONYM|Q|SUB|SUP|SPAN|BDO';

#
# This pattern specifies attribute of a HTML tag which should be
# searchable.
#
# $HTML_ATTRIBUTES = 'ALT|SUMMARY|TITLE';

#===================================================================
#
# Critical Numbers
#

#
# The max size of files which can be loaded in memory at once.
# If you have much memory, you can increase the value.
# If you have less memory, you can decrease the value.
#
# $ON_MEMORY_MAX = 5000000;

#
# The max file size for indexing. Files larger than this
# will be ignored.
# NOTE: This value is usually larger than TEXT_SIZE_MAX because
# binary-formated files such as PDF, Word are larger.
#
# $FILE_SIZE_MAX = 2000000;
↑ $FILE_SIZE_MAXはインデックス作成対象とするファイルの最大サイズをbyte単位で定義しています。defaultでは2000000byte=2Mbyteです。画像などを含むサイズが2Mbyte以上のファイルを扱う場合は適宜、数字を大きくしてください。$FILE_SIZE_MAXの制限に引っかかると、mknmzを実行中に「ファイルが巨大なので、無視しました」というメッセージが表示されます。

#
# The max text size for indexing. Files larger than this
# will be ignored.
#
# $TEXT_SIZE_MAX = 600000;
↑ $TEXT_SIZE_MAXはインデックス作成対象とするファイルから抽出したtextの最大サイズをbyte単位で定義しています。defaultでは600000byte=600Kbyteです。上の$FILE_SIZE_MAXのサイズ制限をクリアしているのに「ファイルが巨大なので、無視しました」というメッセージが表示される場合は$TEXT_SIZE_MAXの制限に引っかかっていることも考えられます。適宜、サイズを大きくしてみてください。

#
# The max length of a word. the word longer than this will be ignored.
#
# $WORD_LENG_MAX = 128;


#
# Weights for HTML elements which are used for term weightning.
#
# %Weight =
# (
# 'html' => {
# 'title' => 16,
# 'h1' => 8,
# 'h2' => 7,
# 'h3' => 6,
# 'h4' => 5,
# 'h5' => 4,
# 'h6' => 3,
# 'a' => 4,
# 'strong' => 2,
# 'em' => 2,
# 'kbd' => 2,
# 'samp' => 2,
# 'var' => 2,
# 'code' => 2,
# 'cite' => 2,
# 'abbr' => 2,
# 'acronym'=> 2,
# 'dfn' => 2,
# },
# 'metakey' => 32, # for <meta name="keywords" content="foo bar">
# 'headers' => 8, # for Mail/News' headers
# );

#
# The max length of a HTML-tagged string which can be processed for
# term weighting.
# NOTE: There are not a few people has a bad manner using
# <h[1-6]> for changing a font size.
#
# $INVALID_LENG = 128;

#
# The max length of a field.
# This MUST be smaller than libnamazu.h's BUFSIZE (usually 1024).
#
# $MAX_FIELD_LENGTH = 200;


#===================================================================
#
# Softwares for handling a Japanese text
#

#
# Network Kanji Filter nkf v1.71 or later
#
# $NKF = "module_nkf";

#
# KAKASI 2.x or later
# Text::Kakasi 1.05 or later
#
# $KAKASI = "/usr/local/bin/kakasi -ieuc -oeuc -w";

#
# ChaSen 2.02 or later (simple wakatigaki)
# Text::ChaSen 1.03
#
# $CHASEN = "no";

#
# ChaSen 2.02 or later (with noun words extraction)
#
# $CHASEN_NOUN = "no";

#
# MeCab
#
# $MECAB = "no";

#
# Default Japanese processer: KAKASI or ChaSen or MeCab.
#
# $WAKATI = $KAKASI;


#===================================================================
#
# Directories
#
# $LIBDIR = "@PERLLIBDIR@";
# $FILTERDIR = "@FILTERDIR@";
# $TEMPLATEDIR = "@TEMPLATEDIR@";
#

# 1;


 namazuコマンド設定

 インデックスをもとに検索を行うnamazuコマンドを設定します。
# cp /usr/local/etc/namazu/namazurc-sample /usr/local/etc/namazu/namazurc ← サンプルより設定ファイルコピー
# 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.example.jp/~foo/
##    Replace  /home/(.*)/public_html/  http://www.example.jp/\1/
##    Replace  /[Cc]\|/foo/             http://www.example.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.example.jp/~foo/
Replace  /var/www/html   https://www.bigbang.mydns.jp/
↑ 追加(/var/www/htmlをhttps://www.bigbang.mydns.jpに置換する例)
##
## 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 ← 追加(検索結果の日本語化)
 詳細については下記を参考にしてください。
# This is a Namazu configuration file for namazu or namazu.cgi.
#
# Originally, this file is named 'namazurc-sample'. so you should
# copy this to 'namazurc' to make the file effective.
# see 'doc/ja/manual.html#namazurc' or 'doc/en/manual.html#namazurc'.
#
# Each item is must be separated by one or more SPACE or TAB characters.
# You can use a double-quoted string for represanting a string which
# contains SPACE or TAB characters like "foo bar baz".


##
## Index: Specify the default directory.
##
#Index /usr/local/var/namazu/index ← mknmzでインデックスを作成したディレクトリを指定します。特に設定しなくても動作します。


##
## Template: Set the template directory containing
## NMZ.{head,foot,body,tips,result} files.
##
#Template /usr/local/var/namazu/index ← 検索結果などを表示するためのtemplateファイルの置き場所を指定します。mknmzが生成する標準のtemplateを使用する場合はIndexと同じディレクトリを指定しておきます。


##
## 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.example.jp/~foo/
## Replace /home/(.*)/public_html/ http://www.example.jp/\1/
## Replace /[Cc]\|/foo/ http://www.example.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.example.jp/~foo/ ← このReplaceがnamazurcの肝です。検索対象の文書を置いたLocalのPCのディレクトリをhttp://で始まるURLに置き換える動作をします。
Replace /var/www/html/ http://bigbang.dyndns.org/


##
## Logging: Set OFF to turn off keyword logging to NMZ.slog.
## Default is ON.
##
#Logging off


##
## 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

##
## Scoring: Set the scoring method "tfidf" or "simple".
##
#Scoring tfidf


##
## EmphasisTags: Set the pair of html elements which is used in
## keyword emphasizing for search results.
##
#EmphasisTags "<strong class=\"keyword\">" "</strong&lgt;"

##
## MaxHit: Set the maximum number of documents which can be
## handled in query operation. If documents matching a
## query exceed the value, they will be ignored.
##
#MaxHit 10000

##
## MaxMatch: Set the maximum number of words which can be
## handled in regex/prefix/inside/suffix query. If documents
## matching a query exceed the value, they will be ignored.
##
#MaxMatch 1000

##
## ContentType: Set "Content-Type" header output. Specify "charset".
##
## When you specify English, French, German and Spanish charset
##
#ContentType "text/html; charset=ISO-8859-1"
##
## When you specify Polish charset
##
#ContentType "text/html; charset=ISO-8859-2"
##
## When you specify Japanese charset by UNIX
##
#ContentType "text/html; charset=EUC-JP"
##
## When you specify Japanese charset by Windows
##
#ContentType "text/html; charset=Shift_JIS"
##
## If you want to use non-HTML template files, set it suitably.
##
#ContentType "text/x-hdml; charset=Shift_JIS"

##
## Charset: "charset" of each "Lang" is defined.
## When "charset" is not included in "ContentType", "charset" of default
## of each "Lang" is output.
## Please define it by "Charset" when you use the language of the
## unsupport. (It is necessary to prepare the template and the message
## catalog.)
##
#Charset "ja" "EUC-JP"
##
#Charset "ja_JP.SJIS" "Shift_JIS"
##
#Charset "ja_JP.ISO-2022-JP" "ISO-2022-JP"
##
#Charset "fr" "ISO-8859-1"
##
#Charset "de" "ISO-8859-1"
##
#Charset "es" "ISO-8859-1"
##
#Charset "pl" "ISO-8859-2"

##
## Suicide_Time: namazu.cgi stops the process in 60 seconds by
## default.
## (Only UNIX)
##
#Suicide_Time 60

##
## Regex_Search: Set OFF to turn off regex_search.
## Default is ON.
##
#Regex_Search off


●Namazu確認

 インデックス作成

 例として、/var/www/htmlのインデックスを/usr/local/var/namazu/index/mydnsに作成します。

 インデックスを/usr/local/var/namazu/index以外のディレクトリに作成する場合、namazurcの設定ファイルを下記のように修正してください。
# vi /usr/local/etc/namazu/namazurc

※下記はインデックスの出力先を/mnt/var/namazu/indexにした場合
Index         /usr/local/var/namazu/index
 ↓
Index         /mnt/var/namazu/index
 このように修正しないと、GUIでの検索時に結果が表示されません。

 下記のようなエラーが表示された場合(その1)
# mkdir /usr/local/var/namazu/index/mydns ← インデックス作成先ディレクトリ作成
# mknmz /mnt/var/www/html -O /usr/local/var/namazu/index/mydns | nkf -w ← インデックス作成
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/%{ <-- HERE ?([a-z]+)}?/ \
at /usr/local/share/namazu/filter/hnf.pl line 247.
Compilation failed in require at /usr/local/bin/mknmz line 419.
 下記のように修正してください。
# vi /usr/local/share/namazu/filter/hnf.pl
$uri =~ s/%{?([a-z]+)}?/$param{$1}/g;
 ↓
$uri =~ s/%\{?([a-z]+)}?/$param{$1}/g; ← '{'をエスケープ
 下記のようなエラーが表示された場合(その2)
# mkdir /usr/local/var/namazu/index/mydns ← インデックス作成先ディレクトリ作成
# mknmz /mnt/var/www/html -O /usr/local/var/namazu/index/mydns | nkf -w ← インデックス作成
sh: no: command not found

# rpm -q nkf ← nkfインストール確認
nkf-2.0.8b-1.fc9
# yum -y install nkf ← nkfインストール※インストールされていない場合
# vi /etc/namazu/mknmzrc ← mknmz設定ファイル編集
# $NKF = "no";

$NKF = "/usr/bin/nkf"; ← nkfコマンドパスを指定
 エラーが表示されなければ特に対応は不要です。

 下記のようなエラーが表示された場合(その3)
# mkdir /usr/local/var/namazu/index/mydns ← インデックス作成先ディレクトリ作成
# mknmz /mnt/var/www/html -O /usr/local/var/namazu/index/mydns | nkf -w ← インデックス作成
Useless use of greediness modifier '?' in regex; marked by $lt;-- HERE in m/^\w+:{1,1}? $lt;-- HERE / at /usr/local/share/namazu/filter/mp3.pl line 155.
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058.
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058, $lt;GEN9$gt; line 2.
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058, $lt;GEN9$gt; line 3.
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058, $lt;GEN9$gt; line 4.
 下記のように修正します。
# vi /usr/local/share/namazu/filter/mp3.pl
$$contref =~ s/^\w+:{1,1}?//gm;
 ↓
$$contref =~ s/^\w+:\{1,1}?//gm; ← '{'をエスケープ
 再度、インデクス作成を実行し、エラーがでなければ対応完了です。
# mkdir /usr/local/var/namazu/index/mydns ← インデックス作成先ディレクトリ作成
# mknmz /var/www/html -O /usr/local/var/namazu/index/mydns | nkf -w ← インデックス作成
※最後の「| nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する
検索対象のファイルを調べています...
608個のファイルがインデックス作成の対象として見つかりました
1/608 - /var/www/html/03a.html [text/html]
2/608 - /var/www/html/03a.txt [text/plain]
3/608 - /var/www/html/03a2.html [text/html]
4/608 - /var/www/html/03a2.txt [text/plain]
  :
インデックスを書き出しています...
[基本]
日付:                Wed Aug  3 09:38:18 2011
追加された文書の数:  442
サイズ (bytes):      14,678,171
合計の文書数:        442
追加キーワード数:    63,689
合計キーワード数:    63,689
わかち書き:          /usr/local/bin/kakasi -ieuc -oeuc -w
経過時間 (秒):       1,082
ファイル/秒:         0.41
システム:            linux
Perl:                5.008008
Namazu:              2.0.21

 インデックスをもとに検索
# namazu test /usr/local/var/namazu/index/mydns | nkf -w
※最後の「|nkf -w」はシステムの文字コードがUTF-8の場合のみ指定する
検索結果

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

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

1. 動作テスト用ファイル、PHP、Perl、Java、PostgreSQL、MySQL、DB、JSP、サーブレット - サンプル (スコア: 77)
著者: 不明
日付: Mon, 27 Jun 2011 19:17:30 +0900
動作テスト用ファイル、PHP、Perl、Java、PostgreSQL、MySQL、DB、JSP、サーブレット - サンプル ●はじめに ●HTML / test.html ●CGI(Perl) / test.cgi ●CGI(Perl + PostgreSQL、use Pg) / perl_pg_postgres.cg
/var/www/html/sample-x.htm (69,162 bytes)

現在のリスト: 1 - 20



●namazu.cgi設置

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

●namazu.cgi設定
# nkf -w /usr/local/var/namazu/index/mydns/NMZ.head.ja > NMZ.head.ja
 ← namazu.cgi検索結果ページヘッダファイルをUTF-8に変換
※システムの文字コードがUTF-8の場合のみ
# 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="mydns"> ← コメントを解除してインデックス格納ディレクトリ名を指定

<a href="{cgi}">[検索方法]</a>

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

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

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

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

# 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>

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

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

●namazu.cgi確認

 http://(サーバ名)/cgi-bin/namazu.cgi?idxname=mydnsにアクセスして「Namazu による全文検索システム」というページが表示されるので、キーワードを入れて検索してみましょう。
※idxname=mydnsのmydnsの部分は、インデックス作成先ディレクトリ名(ここでは/usr/local/var/namazu/index/mydns/なのでmydns)を指定する

●namazu用検索ウィンドウの作成

 DocumentRootディレクティブに注意して作成します。例:/var/www/html以下に作成

# vi /var/www/html/search.html ← 検索用ウィンドウをsearch.htmlとして作成
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head lang="ja">
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>Namazuによる全文検索システム</title>
</head>
<body bgcolor="#ffffff" LANG="ja">
<h1>Namazu による全文検索システム</h1>
<hr />
<form method="get" action="/cgi-bin/namazu.cgi">
<p>
<strong>検索式:</strong>
<input name="query" size="40" value="" type="text">
<input name="submit" value="Search!" type="submit">
<input name="whence" value="0" type="hidden">
</p>
<p>
<strong>表示件数:</strong>
<select name="max">
<option value="10">10</option>
<option value="20" selected="selected">20</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
<strong>表示形式:</strong>
<select name="result">
<option value="normal" selected="selected">標準</option>
<option value="short">簡潔</option>
</select>
<strong>ソート:</strong>
<select name="sort">
<option value="score" selected="selected">スコア</option>
<option value="date:late">日付 (新しい順)</option>
<option value="date:early">日付 (古い順)</option>
<option value="field:subject:ascending">題名 (昇順)</option>
<option value="field:subject:descending">題名 (降順)</option>
<option value="field:from:ascending">著者 (昇順)</option>
<option value="field:from:descending">著者 (降順)</option>
<option value="field:size:ascending">サイズ (昇順)</option>
<option value="field:size:descending">サイズ (降順)</option>
<option value="field:uri:ascending">URI (昇順)</option>
<option value="field:uri:descending">URI (降順)</option>
</select>
</p>
<blockquote>
<strong>検索対象:</strong>
<ul>
<!--
<li><input type="checkbox" name="idxname" value="foo">foo</li>
<li><input type="checkbox" name="idxname" value="bar">bar</li>
<li><input type="checkbox" name="idxname" value="baz">baz</li>
-->
<li><input type="checkbox" name="idxname" value="public" checked>public</li>
<li><input type="checkbox" name="idxname" value="mydns" checked>bigbang</li>
</ul>
</blockquote>
</form>
<hr />
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<!-- LINK-REV-MADE -->
<link rev="made" href="mailto:webmaster@localhost">
<!-- LINK-REV-MADE -->
<title>Namazu: a Full-Text Search Engine</title>
<style type="text/css"><!--
strong.keyword { color: Red; }
p.example { text-indent: 1em;
color: Navy;
font-weight: bold;
font-family: monospace; }
code { color: Navy;
font-family: monospace; }
code.example { color: Navy;
font-weight: bold;
font-family: monospace; }
code.operator { color: Navy;
font-family: monospace;
font-weight: bold; }
--></style>
</head><body lang="ja">
<h2><a name="query" id="query">検索式</a></h2>
<h3><a name="query-term" id="query-term">単一単語検索</a></h3>
<p>
調べたい単語を一つ指定するだけのもっとも基本的な検索手法です。
例:
</p>
<p class="example">
namazu
</p>
<h3><a name="query-and" id="query-and">AND検索</a></h3>
<p>
ある単語とある単語の両方を含む文書を検索します。検索結果を絞り込むのに有効です。3つ以上の単語を指定することも可能です。
単語と単語の間に <code class="operator">and</code> を挿みます。例:
</p>
<p class="example">Linux and Netscape</p>
<p>
<code class="operator">and</code> は省略できます。単語を空白で区切って羅列するとそれらの語すべてを含む文書をAND検索します。
</p>
<h3><a name="query-or" id="query-or">OR検索</a></h3>
<p>
ある単語とある単語のどちらかを含む文書を検索します。3つ以上の単語を指定することも可能です。単語と単語の間に <code class="operator">or</code> を挿みます。例:
</p>
<p class="example">
Linux or FreeBSD
</p>
<h3><a name="query-not" id="query-not">NOT検索</a></h3>
<p>
ある単語を含み、ある単語を含まない文書を検索します。3つ以上の単語を指定することも可能です。単語と単語の間に <code class="operator">not</code> を挿みます。例:
</p>
<p class="example">
Linux not UNIX
</p>
<h3><a name="query-grouping" id="query-grouping">グループ化</a></h3>
<p>
AND検索、OR検索、NOT検索を括弧でグループ化できます。括弧の両隣には空白を入れる必要があります。例:
</p>
<p class="example">
( Linux or FreeBSD ) and Netscape not Windows
</p>
<h3><a name="query-phrase" id="query-phrase">フレイズ検索</a></h3>
<p>
2語以上からなる複合語を検索します。 <code class="operator">"..."</code> と2重引用符で、あるいは <code class="operator">{...}</code> と中括弧で囲みます。Namazuのフレイズ検索は精度が 100 % ではないため、ときどき誤ることがあります。例: </p> <p class="example">
{GNU Emacs}
</p>
<!-- foo
<p>
Tknamazu および namazu.el から検索するときは必ず後者で指定します。
</p>
-->
<h3><a name="query-substring" id="query-substring">部分一致検索</a></h3>
<p>
部分一致検索には前方一致、中間一致、後方一致の 3種類があります。
</p>
<dl>
<dt>前方一致検索</dt>
<dd><code class="example">inter*</code>
(<code>inter</code> から始まる単語を含む文書を検索)</dd>
<dt>中間一致検索</dt>
<dd><code class="example">*text*</code>
(<code>text</code> を内包する単語を含む文書を検索)</dd>
<dt>後方一致検索</dt>
<dd><code class="example">*net</code>
(<code>net</code> で終わる単語を含む文書を検索)</dd>
</dl>

<h3><a name="query-regex" id="query-regex">正規表現検索</a></h3>
<p>
検索するキーワードを正規表現で指定します。正規表現は
<code class="operator">/.../</code> のようにスラッシュ記号で囲みます。正規表現のエンジンには<a href="http://www.ruby-lang.org/">Ruby</a>のコードを利用 しています。正規表現の書式は<a href="http://www.perl.com/">Perl</a>とほぼ同じです。 例: </p>
<p class="example">
/インター?フェ[イー]ス/
</p>

<h3><a name="query-field" id="query-field">フィールド指定の検索</a></h3>
<p>
<code>Subject:</code>, <code>From:</code>,
<code>Message-Id:</code> といったフィールドを指定して検索する手法です。特にMail/News のファイルを扱う際に効果を発揮します。例: </p>
<ul>
<li><code class="example">+subject:Linux</code><br>
(Subject: に <code>Linux</code>が含まれる文書) </li>
<li><code class="example">+subject:"GNU Emacs"</code><br>
(Subject: に <code>GNU Emacs</code>が含まれる文書)
</li>
<li><code class="example">+from:foo@example.jp</code><br>
(From: に <code>foo@example.jp</code> が含まれる文書)
</li>
<li><code class="example">+message-id:<199801240555.OAA18737@foo.example.jp></code><br>
(Message-Id を指定)
</li>
</ul>
<h3><a name="query-notes" id="query-notes">特記事項</a></h3>
<ul>
<li>いずれの検索方法でもアルファベットの大文字・小文字の区別 はしません。
</li>
<li>日本語の複合語は形態素単位に分割し、それらを<a href="#query-phrase"> フレイズ検索</a>します。分割は不適切に行なわれることがあります。
</li>
<li>JIS X 0208 (いわゆる全角文字) の英数字と記号の一部 (ASCIIと重複しているもの) は ASCII (いわゆる半角文字) として処理されます。
</li>
<li>記号を含む語の検索ができます。例: <code>TCP/IP</code>。ただし、記号の処理は完全ではないので <code>TCP and IP</code> のように分割して<a href="#query-and">AND検索</a>をかけた方が取りこぼしがありません (その代わり余計なファイルまでヒットしてしまう可能性があります)。
</li>
<li>中間一致・後方一致、正規表現、フィールド指定の検索には少し時間がかかります。
</li>
<li><code class="operator">and</code>, <code class="operator">or</code>, <code class="operator">not</code> を単語として検索したいときはそれぞれ、 <code class="operator">"..."</code> と2重引用符で、あるいは <code class="operator">{...}</code> と中括弧で囲みます。
</li>
</ul>
<hr>
<p>
この全文検索システムは
<strong><a href="http://www.namazu.org/">Namazu</a></strong>
によって構築されています。
</p>
</body>
</html>


●インデックス更新自動化
# vi /usr/local/bin/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`
#####
#echo $SYSTEM_LANG > /root/lang
#####直接コマンド実行すると問題ないが、cron起動すると「$SYSTEM_LANG」の中が空になってしまう。
#####
# システム文字コードをeucにする
export LANG=ja_JP.eucJP
#####
#echo $SYSTEM_LANG >> /root/lang
#####直接コマンド実行すると問題ないが、cron起動すると「$SYSTEM_LANG」の中が空になってしまう。
#####
# インデックス作成
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.UTF8" ]; then
    nkf -w $TEMP_LOG | logger -t mknmz
elif [ "$SYSTEM_LANG" = "ja_JP.eucJP" ]; then
    nkf -e $TEMP_LOG | logger -t mknmz
else
#    cat $TEMP_LOG | logger -t mknmz #####コマンド直接実行だと、この設定で問題ない。
    nkf -w $TEMP_LOG | logger -t mknmz ###### cron起動すると「$SYSTEM_LANG」の中が空になってしまうための対処。
fi
#####
#echo $SYSTEM_LANG >> /root/lang
#####直接コマンド実行すると問題ないが、cron起動すると「$SYSTEM_LANG」の中が空になってしまう。
#####
rm -f $TEMP_LOG
# 月曜日はインデックスの最適化(不要データの掃除)も行う
[ $(date +%w) = "1" ] && gcnmz -qb $IDX
# chmod 700 /usr/local/bin/mknmz.sh ← mknmz実行スクリプトに実行権限付加
# echo "0 0 * * * root /usr/local/bin/mknmz.sh /var/www/html /usr/local/var/namazu/index/mydns" > /etc/cron.d/mknmz
 ← mknmz定期自動実行設定追加
 ※毎日00:00にmknmz実行スクリプトを実行します
 ※インデックス作成対象ディレクトリ内で、インデックス作成対象外にしたいディレクトリまたはファイルがある場合
# echo "/var/www/html/exclude/" >> mknmz.exclude
 ← /var/www/html/exclude/をインデックス作成対象外リストに追加
# echo "/var/www/html/excludefile.*" >> mknmz.exclude
 ← /var/www/html/excludefile.*をインデックス作成対象外リストに追加
# ./mknmz.sh /var/www/html /usr/local/var/namazu/index/mydns 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)を検索できるページのほかに、サイト内の特定ディレクトリ(例:/home/public/public_html)内のファイルのみ検索できるようにしたい場合は、新たにインデックスを作成すればよい。

NMZ.*ファイルの仕様はこちらを参照してください。
全文検索システムNamazu説明書はこちらを参照してください。

●MMagic.pmのエラー

 参考URL:Bug #109673 for File-MMagic: Redundant argument in sprintf from magicMatch

 cron実行時(/root/cron/mknmz.sh /var/www/html/ /usr/local/var/namazu/index/mydns/)に下記のようなエラーがメールに届くようになりました
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058, <GEN13> line 7.
Redundant argument in sprintf at /usr/local/share/perl5/File/MMagic.pm line 1058, <GEN13> line 8.
 上記を参考に下記のように対応しました。
# vi /usr/local/share/perl5/File/MMagic.pm
1056         else {
1057 #           $$p_desc .= ' ' . sprintf($message,$data) if $message;
1058 #           $$p_desc .= sprintf($message,$data) if $message;
1059             $$p_desc .= index($message, '%') >= 0 ? sprintf($message, $data) : $message if $message;
1060         }
 変更することによりエラーが出なくなりました。