Namazuによる全文検索システムの構築(SuSE編)


コンテンツが増加してきたのに伴い、検索機能があると便利との指摘を頂きましたので、広く使われているNamazuによる全文検索システムを導入してみました。検索対象は当サイト全体ではなく、おやじのサイトのみです。
SuSE の場合、関連モジュールが全てRPMで用意されているので導入はいたって簡単です。

■関連モジュールのインストール

Namazuによる全文検索システムを動かすには、Namazu以外にKakasiとnkfが必要です。これらは、YaSTで簡単にインストールできます。
なお、大前提として Apache や Perl は当然インストール済みで動作しているものとします。

  1. YaST コントロールセンタを起動し、「ソフトウェア」の「ソフトウェアのインストール/削除」を起動する。

  2. 「フィルタ」 を 「検索」 とし下記の名前で検索し、検索されたモジュール全てにチェックマークを入れてインストール (「了解」 を押す ) する。依存関係でperl-File-MMagic-1.17-47 が必要と出てくるのでそれもインストールしてください。

    No.

    検 索 名

    関連モジュール

    備 考

    1

    namazu

    namazu-2.0.12-94
    namazu-cgi-2.0.12-94
    namazu-devel-2.0.12-94

    日本語全文検索システム

    2

    kakasi

    kakasi-2.3.4-307
    kakasi-devel-2.3.4-307
    kakasi-dict-2.3.4-307
    perl-Text-Kakasi-1.05-305

    分かち書きエンジン

    3

    nkf nkf-2.0.2-35
    perl-NKF-2.0.2-35
    コード変換

    4

    MMagic perl-File-MMagic-1.17-47 File種別推測

■Namazu の設定

インストールが済んだら、Namazuの設定をしていきます。YaSTでインストールすると、設定ファイル ( namazurc、mknmzrc ) が /etc/namazu 配下にインストールされますので、これをカストマイズしていきます。

◆namazurc の設定

namazurcでは、namazuの基本的な動作に関する設定を行います。

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

#  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 では、mknmzでインデックスを作成したディレクトリを指定する。RPMで入れたときに作成されるインデックス用ディレクトリとデフォルトの指定が何故かアンマッチになっている。ここでは、RPMで作成されるディレクトリを指定した。mknmzでインデックス作成時にあらかじめディレクトリを作成しておかないとエラーになるので注意が必要である。
#Index         /usr/local/var/namazu/index
Index         /var/lib/namazu/index

##
## Template: Set the template directory containing
## NMZ.{head,foot,body,tips,result} files.
##
#Template では検索画面などを表示する時のtemplateファイルの置き場所を指定する。mknmzが生成する標準のtemplateを使用する場合はコメントアウトのままとするか、Indexと同じディレクトリを指定する。
#Template      /usr/local/var/namazu/index
Template      /var/lib/namazu/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.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.
##
# 検索結果として対象の文書を表示するとき、mknmz で作成したインデックスベースでは Local なディレクトリ構造で表示されてしまうため、そのままでは当然 Web アクセスできない。そこで Replace では、そのディレクトリ構造をhttp:// で始まる URL に置き換える指定をする。下記は、おやじのコンテンツのディレクトリを URL に置き換えるときの例である。(現状はおやじしか使用していないが、UserDir で動作させている時に汎用的な使い方ができるように設定してみた。)
#Replace       /home/foo/public_html/  http://www.foo.bar.jp/~foo/
Replace       /home/(.*)/public_html/  http://www.aconus.com/~\1/

##
## 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の設置は不要。
#Lang          ja
Lang          ja

##
## Scoring: Set the scoring method "tfidf" or "simple".
##
# スコアリング方式の設定をするが、違いがおやじには分からないのでデフォルトのままとした。(継続調査要)
#Scoring       tfidf
Scoring       tfidf

##
## EmphasisTags: Set the pair of html elements which is used in
## keyword emphasizing for search results.
##
# EmphasisTags は、検索キーワードを強調表示するかどうかを指定する。ここは素直にコメントアウトを外す。
#EmphasisTags  "<strong class=\"keyword\">"   "</strong>"
EmphasisTags  "<strong class=\"keyword\">"   "</strong>"

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

##
## ContentType: Set "Content-Type" header output. If you want to
## use non-HTML template files, set it suitably.
# HTMLではないページを出力する場合にHTTPヘッダを設定する。
#ContentType "text/x-hdml"


◆mknmzrc の設定

mknmzrcでは、検索用インデックスを作成する時の動作に関するを設定を行います。基本的には、コメントアウトを外せば済むところも敢えてコピーすることでデフォルトからどう変更したかが分かるようにしてあります。

#
# This is a Namazu configuration file for mknmz.
#
package conf;  # Don't remove this line!

#===================================================================
#
# Administrator's email address
#
# $ADDRESS で管理者のメールアドレスを指定する。
# $ADDRESS = 'webmaster@Dist.suse.de';
$ADDRESS = 'oyaji@mail.aconus.com';

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

#
# This pattern specifies HTML suffixes.
#
# $HTML_SUFFIX では、HTMLファイルとして扱うファイルの拡張子を定義する。 デフォルト設定で、html/htm/phtml/shtml/html.ja等が対象になるので、コメントアウトするだけで通常は済むはず。
# $HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}";
$HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}";

#
# 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ファイル以外は存在しないので、おやじはそのままとした。必要に応じてコメントアウトを外すなり、追記する
# $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|.*\\.ppt" .    # Word, Excel, PowerPoint
#   "|.*\\.j[sabf]w|.*\\.jtd" .        # Ichitaro 4, 5, 6, 7, 8
#   "|\\d+|[-\\w]+\\.[1-9n]";          # Mail/News, man

#
# 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 では、インデックスを作成する対象から外すファイルの拡張子を指定する。おやじは、デフォルトに加え、ログファイルやCGI等を追加するとともに、隠しファイルも追記した。
# $DENY_FILE = ".*\\.(gif|png|jpg|jpeg)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*";
$DENY_FILE = ".*\\.(gif|png|jpg|jpeg|pl|cgi|css|log|dat|ini|lzh|meta|txt|)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*|himitsu.htm";

#
# This pattern specifies PATHNAMEs which will NOT be targeted.
# NOTE: Usually specified by --exclude=regex option.
#
# $EXCLUDE_PATH では、インデックスを作成する対象から外すディレクトリを必要に応じて指定する。
# $EXCLUDE_PATH = undef;
$EXCLUDE_PATH = "/home/oyaji/public_html/himitsu/";

#
# 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 では、URL が / で終っている時に表示するファイル名を指定する。
# $DIRECTORY_INDEX = "";
$DIRECTORY_INDEX = "";

#
# This pattern specifies Mail/News's fields in its header which
# should be searchable.  NOTE: case-insensitive
# 検索できるメールやニュースの Header などのパターンを指定。
# $REMAIN_HEADER = "From|Date|Message-ID";
$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";
$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タグを指定。
# $META_TAGS = "keywords|description";
$META_TAGS = "keywords|description";

#
# This pattern specifies aliases for NMZ.field.* files.
# NOTE: Editing NOT recommended.
# フィールドの別名を指定。(メールの見出名の置換ルールらしい)
# %FIELD_ALIASES = ('title' => 'subject', 'author' => 'from');
%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.
# これらのHTML要素は、スペースに置き換える。
# $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';
 $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';

#===================================================================
#
# 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 は、インデックス作成時の作業メモリを指定する。
# $ON_MEMORY_MAX   = 5000000;
$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 では、インデックス作成対象ファイルの最大サイズをByte単位で指定する。デフォルト2MByteなので、通常は十分であるが実態に合わせて適宜設定する。超過したファイルは無視される。
# $FILE_SIZE_MAX   = 2000000;
$FILE_SIZE_MAX   = 2000000;

#
# The max text size for indexing. Files larger than this
# will be ignored.
#
# $TEXT_SIZE_MAX では、インデックス作成対象ファイルのテキストレベルでの最大サイズをByte単位で指定する。デフォルト600KByteなので、通常は十分であるが実態に合わせて適宜設定する。超過したファイルは無視される。
# $TEXT_SIZE_MAX   =  600000;
$TEXT_SIZE_MAX   =  600000;

#
# The max length of a word. the word longer than this will be ignored.
#
# $WORD_LENG_MAX では、検索対象のキーワードの最大サイズをByte単位で指定する。デフォルト128Byteなので、通常は十分であるが実態に合わせて適宜設定する。超過したファイルは無視される。
# $WORD_LENG_MAX   = 128;
$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
# );
# スコアリングの点数
 %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;
$INVALID_LENG = 128;

#
# The max length of a field.
# This MUST be smaller than libnamazu.h's BUFSIZE (usually 1024).
# フィールドの最大長 (バイト)
# $MAX_FIELD_LENGTH = 200;
$MAX_FIELD_LENGTH = 200;

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

#
# Network Kanji Filter nkf v1.62 or later
#
# 漢字フィルタの指定
# $NKF = "module_nkf";
$NKF = "module_nkf";

#
# KAKASI
# KAKASIのパラメータ
# $KAKASI = "module_kakasi -ieuc -oeuc -w";
$KAKASI = "module_kakasi -ieuc -oeuc -w";

#
# ChaSen 1.51 or later (simple wakatigaki)
#
# $CHASEN = "module_chasen -j -F '\%m '";

#
# ChaSen 1.51 or later (with noun words extraction)
#
# $CHASEN_NOUN = "module_chasen -j -F '\%m %H\\n'";

#
# Default Japanese processer: KAKASI or ChaSen.
# 分かち書きエンジンの指定。
# $WAKATI  = $KAKASI;
$WAKATI  = $KAKASI;

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

# 1;

 

◆インデックスの作成

mknmzrcでインデックス作成のための設定が終了したら、いよいよおやじのコンテンツのインデックスを作成します。インデックス作成は、mknmzコマンドで下記のように行います。これにより、指定したインデックス出力ディレクトリ配下に、「NMZ.xxx」というインデックスファイルと検索画面用のtemplateが出力されるはずです。

# mknmz -a -U -O /var/lib/namazu/index/ /home/oyaji/public_html/

-a : 全てのファイルを対象
-U : URI encode の復元を行わない(2バイト文字の文字化け対策)
-O /var/lib/namazu/index/ : 作成したインデックスを出力するディレクトリを指定(namazurcのIndex指定と同じ)
/home/oyaji/public_html : インデックスを作成するコンテンツのディレクトリを指定


◆検索ページの作成

検索ページの作成とは書きましたが、RPMからインストールすると /src/www/cgi-bin/ 配下に namazu.cgi という検索用CGIがインストールされています。従って、Apache のほうで意識して設定を変更していない限り、「 http://www.aconus.com/cgi-bin/namazu.cgi 」 とブラウザでアクセスするだけで、namazu標準の検索画面が表示されるので、適当なキーワードで検索すれば検索できるはずです。

検索画面のカストマイズや設置場所(アクセス方法)の変更については、インターネット上にいくらでもありますので、そちらを参考にしてください。

■インデックスの更新とお掃除の設定

コンテンツが変更になるたびに、手動でインデックスの更新をしているわけにもいきませんので、cron で1回/日 自動的に更新してあげることにしました。また、文書の更新・削除を伴うインデックスの更新を繰り返していくと、インデックス内に不要なデータが溜まっていき、その対策として gcnmz コマンドを使用するとこの不要なデータを削除できるとのことなので、一連の作業を簡単なスクリプトにまとめて cronで起動することにしました。

#!/bin/sh

/usr/bin/mknmz -q -a -U -O /var/lib/namazu/index/ /home/oyaji/public_html/
/usr/bin/gcnmz -q /var/lib/namazu/index/


上記の内容を /usr/local/bin/ 配下に mkindex.sh として作成し、crontab で1回/日起動するようにしました。

20 2 * * * root /usr/local/bin/mkindex.sh



Top Pageへ