ライン

ポイント:これまで通りに変わりなく導入設定

ライン

 はじめに

databases/namazu2

 国産の検索エンジンの中で最も有名なナマズを導入するメモを備忘録として残します。
以前ほど詳細ではありませんが、機会を見て更新していきます。

 FreeBSD 9.1での例です。

 導入と設定

導入

 早速、導入を開始します。portsから導入を行います。

# cd /usr/ports/databases/namazu2
# make install clean

 /usr/local/etc/namazu 以下には、サンプルが準備されています。

mknmzrc-sample
mknmzrc-sample.win32
namazurc-sample
namazurc-sample.win32

win32は意味がわかりませんが、サンプルをベースに作成していきます。
バーチャルドメインがある場合には、それぞれで作成するのがいいと思います。

 以下の例では、 /home 以下の foo アカウント以下に example.ne.jp というディレクトリがあることを前提で記述します。
CGI ディレクトリは、ここでは cgi という中に入る前提で記述します。

設定

 サンプルファイルは、すべてコメント行になっているファイルですので、基本はデフォルトという状態です。
コピーしてから修正していきましょう。

% cp /usr/local/etc/namazu/namazurc-sample /home/foo/example.ne.jp/cgi/.namazurc
% cp /usr/local/libexec/namazu.cgi  /home/foo/example.ne.jp/cgi/

.namazurc を修正していきます。
変更は、1行後に記述し、太文字で表示しておきます。

# 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
Index         /usr/local/var/namazu/

##
## Template: Set the template directory containing
## NMZ.{head,foot,body,tips,result} files.
##
#Template      /usr/local/var/namazu/index
Template      /usr/local/var/namazu/example.ne.jp.main

##
## 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/
# 以下、2行は tDiary 用の設定
##Replace         /home/foo/example.ne.jp/blog/html/(\d\d\d\d)/ http://example.ne.jp/blog/?date=\1
##Replace         /home/foo/diary/cache/html/(\d\d\d\d)/ http://example.ne.jp/diary/?date=\1
Replace         /home/foo/example.ne.jp/                      http://example.ne.jp/

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

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

##
## 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.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のファイルを生成されるファイルを作成しておきます。

# cd /usr/local/var/namazu/
# mkdir example.ne.jp.main

として準備します。
 root権限での作業と個人ディレクトリの作業が混在している書き方になっていて、わかりにくくで申し訳ありませんが。

 設定ファイルは /usr/local/etc/namazu 以下にそのまま準備することにしました。

# cd /usr/local/etc/namazu/
# cp mknmzrc-sample mknmzrc.example.ne.jp.main

を実行しておきます。以下、同様にサンプルファイルとその修正を記述。

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

#===================================================================
#
# Administrator's email address
#
# $ADDRESS = 'webmaster@HOST.example.ne.jp';
$ADDRESS = 'foo@example.ne.jp';

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

#
# This pattern specifies HTML suffixes.
#
# $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_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)|.*\\.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

#
# 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.*";
$DENY_FILE = ".*\\.(gif|png|jpg|jpeg|cgi|pl|csv)|.*\\.tar\\.gz|core|404.html|form.html|.*\\.bak|.*~|\\..*|\x23.*
|.*\\.txt|googleXXXXXXXXXXXXXXXX.html";

#
# 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_DDN = "con|aux|nul|prn|lpt[1-9]|com[1-9][0-9]?|clock\$|xmsxxxx0";

#
# This pattern specifies PATHNAMEs which will NOT be targeted.
# NOTE: Usually specified by --exclude=regex option.
#
# $EXCLUDE_PATH = undef;
$EXCLUDE_PATH = "/home/foo/example.ne.jp/temp/|/home/foo/example.ne.jp/cgi/|
/home/foo/example.ne.jp/images/|/home/foo/example.ne.jp/diary/";

#
# 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 = "";
$DIRECTORY_INDEX = "index.html|index.shtml|index.htm";

#
# 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";
$SEARCH_FIELD = "message-id|subject|date|uri|newsgroups|to|summary|size";

#
# This pattern specifies meta tags which used for field-specified
# searching.  NOTE: case-insensitive
#
# $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.
#
# $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';

#
# This pattern specifies attribute of a HTML tag which should be
# searchable.
#
# $HTML_ATTRIBUTES = 'ALT|SUMMARY|TITLE';
$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;

#
# The max text size for indexing. Files larger than this
# will be ignored.
#
# $TEXT_SIZE_MAX   =  600000;

#
# 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";
$NKF = "module_nkf";

#
# KAKASI 2.x or later
# Text::Kakasi 1.05 or later
#
# $KAKASI = "module_kakasi";
$KAKASI = "module_kakasi";

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

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

#
# MeCab
#
# $MECAB = "module_mecab";

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

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

# 1;

以上の修正を加えました。

 今回も nkf と kakasi を対象として作りましたので、このパッケージを導入しておきます。

# cd /usr/ports/japanese/p5-nkf
# make install clean
# cd /usr/ports/japanese/p5-Text-Kakasi
# make install clean

として作成完了です。

 実際に同ホームページの中身の検索用インデックスファイルを作成してみることにします。
これ用の更新ファイルを作成しました。
 相変わらず、2行がコメントにしてありますが、この部分は今は気にしないでください。tDiary用の設定の時に利用するものです。

#!/bin/csh
setenv LANG ja_JP.EUC
setenv LC_ALL ja_JP.EUC
set path = (/sbin /bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin)
cd /usr/local/var/namazu/example.ne.jp.main
mknmz -k --config=/usr/local/etc/namazu/mknmzrc.example.ne.jp.main /home/foo/example.ne.jp
# cd /usr/local/var/namazu/example.ne.jp.diary
# mknmz -k --config=/usr/local/etc/namazu/mknmzrc.example.ne.jp.diary /home/foo/diary/cache/html/

実際に実行すると

Looking for indexing files...
999 files are found to be indexed.
1/999 - /home/foo/example.ne.jp/123-123.html [text/html]
2/999 - /home/foo/example.ne.jp/index.hml [text/html]
.
.
.
Writing index files...
[Base]
Date:                DDD MMM DD HH:MM:SS YYYY
Added Documents:     999
Size (bytes):        999,999,999
Total Documents:     999
Added Keywords:      333,444
Total Keywords:      333,444
Wakati:              module_kakasi
Time (sec):          40
File/Sec:            13.86
System:              freebsd
Perl:                5.008009
Namazu:              2.0.18

のような表示が行われたと思います。
 大丈夫そうだったら、/etc/crontab に仕込んでおきましょう。

20      2       *       *       *       root    /bin/csh /usr/local/etc/namazu/namazu-example.ne.jp.csh > /dev/null 2>&1 /dev/null

のように。

 ここで、一度インターネットブラウザからアクセスしてみることにしました。
「Namazu による全文検索システム
現在、 31 の文書がインデックス化され、 9,933 個のキーワードが登録されています。 」
 のようにページが表示されてきました。

> namazu -f /home/foo/example.ne.jp/cgi/.namazurc -C
読み込んだ設定ファイル: /home/foo/example.ne.jp/cgi/.namazurc
--
インデックス (Index):    /usr/local/var/namazu/
ログの記録 (Logging):    on
使用する言語 (Lang):     ja_JP.SJIS
スコア計算 (Scoring):    tfidf
テンプレート (Template): /usr/local/var/namazu/mknmzrc.example.ne.jp.main
ヒット件数の上限 (MaxHit):      10000
マッチする語の上限 (MaxMatch):  1000
強調タグ (EmphasisTags): <strong class="keyword">       </strong>
置換 (Replace): /home/foo/example.ne.jp/      http://example.ne.jp/

理由は良くわかりませんが、NMZ.field.from と NMZ.field.from.i が生成されてこなくて、無理矢理0バイトファイルを作成する必要性がありました。Indexに相当する以下は、wwwのユーザでファイルを作成できなかったので、NMZ.warnlog が書き出せないエラーが出ているようでした。

# touch NMZ.warnlog
# chmod 666 NMZ.warnlog

は、追加しておきました。

デザインの修正

そのままのNamazuのデザインでは寂しいので、オリジナルデザインに修正をします。

本体用               NMZ.body.ja
フッター用           NMZ.foot.ja
ヘッダー用           NMZ.head.ja
検索結果             NMZ.result.normal.ja
結果(小)用           NMZ.result.short.ja
使い方説明           NMZ.tips.ja

の5つを自分のエディタで修正してデザインします。

 これは、見てもらえればわかる話なので、今回のページでは詳細には記述しませんが。
本ページの中で検索できる Namazu検索も上記の ヘッダ、フッダ用2つと結果の2つのみを修正してオリジナルにしています。

 後は、フォームは好きに、はめ込めばいいので

<form method="GET" action="/cgi/namazu.cgi">
  <p align="center">検 索 
    <input type="TEXT" name="key" size="30">
    <input type="hidden" name="idxname" value="">
    <input type="SUBMIT" value="検索">
  </p>
</form>

のように、入れてみましょう。

検索できたのではないでしょうか。とても便利に使うことができます。

【改訂履歴】作成:2013/04/13
【参考リンク】
全文検索システム Namazu … Namazu Projectのオフィシャルページ

Copyright © 1996,1997-2006,2007- by F.Kimura,