Namazu

mknmzコマンドでインデックスを作成

2009年8月6日


 Namazuで全文検索を行うには、まずインデックスというのを作成しておく必要があるんだ。そのインデックスを作成するツールが mknmz なんだな。まずはコイツをならすことからはじめないとね。

mknmz を使ってインデックスを作ってみよう

mknmzの構文

mknmz [options] 対象ディレクトリ

インデックスを作成するには mknmz コマンドを使う。mknmz の引数にインデックス作成の対象とするディレクトリ名を与えてみよう。 たとえば、/home/httpd/html を対象とするならば次のとおりだ。

% mknmz /home/httpd/html

すると、 /home/httpd/html 以下 の *.html *.txt といったファイルについてインデックス作成が行われ、 mknmz を実行したディレクトリに NMZ.* というファイルが作成される。この NMZ.* ファイルが Namazu のインデックスだ。

それじゃあ、実際の手順にいってみようか。とりあえず、一番最初に mknmz コマンドのヘルプを表示させる。

% mknmz --help

また、-C オプションを付けると、その時の構成を表示するよ。

それじゃあ、こんどはインデックスの保存先ディレクトリの用意だ。

% mkdir /tmp/index

この例では、インデックスはカレントディレクトリに作られる。もし出力先を変更したい時には -O オプションを使おう。

% mknmz -O /tmp/index ~/public_html

インデックス作成からはずしたいディレクトリがある場合は次の様な感じになる。

% mknmz --exclude=/private -O ./ /home/httpd/html


mknmz コマンド全レシピ

mknmz のコマンドライン構文は以下のとおり。

mknmz の構文

mknmz [options] 対象ディレクトリ

対象ファイル
省略 オプション 対象
-a --all すべてのファイルを対象にしてインデックスを作成(デフォルトではHTMLだけが対象)。
-t --media-type=MTYPE 対象ファイルの文書形式を指定
-h --mailnews --media-type='message/rfc822' と同じ
--mhonarc --media-type='text/html; x-type=mhonarc' と同じ
-F --target-list=FILE インデックス対象のファイルのリストを読み込む
--allow=PATTERN 対象とするファイル名の正規表現を指定
--deny=PATTERN 拒絶するファイル名の正規表現を指定
--exclude=PATTERN 除外するパス名の正規表現を指定
-e --robots 次の記述を含む HTMLファイルを除外
<meta name=\"ROBOTS\" content=\"NOINDEX\">
-M --meta HTMLの <META> タグをフィールド指定検索に使う
-r --replace=CODE URI を置換するためのコードを指定
--html-split HTML ファイルを <a name=\"...\"> 単位で分割処理
--mtime=NUM 変更日制限 find(1) の -mtime と同じ規則
例: -50 で 50 日以内、+50 で 50 日より古いものだけ

-F オプションはファイルのリストが必要になるけど、手作業で作るのは大変だよね。find コマンドを利用してファイルのリストを作成するならこんな感じだよ。

% find `pwd` -type f -print > filelist.txt

形態素解析
省略 オプション 対象
-c --use-chasen 日本語の単語のわかち書きに ChaSen を用いる
-k --use-kakasi 日本語の単語のわかち書きに KAKASI を用いる
-m --use-chasen-noun 名詞のみを抽出
-L --indexing-lang=LANG インデックス時に言語に特化した処理を行なう
,文字列処理
省略 オプション 対象
-E --no-edge-symbol 単語の両端の記号は削除
-G --no-okurigana 送り仮名を削除
-H --no-hiragana 平仮名のみの単語は登録しない
-K --no-symbol 記号をすべて削除
,要約
省略 オプション 対象
-U --no-encode-uri URI のエンコードを行わない
-x --no-heading-summary HTML のヘディングによる要約作成を行わない
インデックス作成
省略 オプション 対象
  --update=INDEX 更新するインデックスを指定
-Y --no-delete 削除された文書の検出を行わない
-Z --no-update 文書の更新・削除を反映しない
その他
省略 オプション 対象
-s --checkpoint チェックポイント機構を作動
-C --show-config 現在の設定を表示
-f --config=FILE 設定ファイルを指定
-I --include=FILE カスタマイズ用ファイルを読み込む
-O --output-dir=DIR インデックスの出力先を指定
-T --template-dir=DIR NMZ.{head,foot,body}.* のディレクトリを指定
-q --quiet インデックス処理の最中にメッセージを表示しない
-v --version バージョン表示
-V --verbose 警告モード
  --debug デバッグモード
  --help ヘルプを表示

mknmz のデフォルト動作は、インデックスの対象ディレクトリにインデックスを作成する。ディレクトリを指定したい場合は、-O オプションを使って次のようにする。

% mknmz -O /tmp/index ~/public_html


mknmzrc を設定してインデックスを作成!

mknmz はコマンドオプションでインデックスの作成方法をいろいろ指定できるけど、毎回それをするのは面倒だよね。そこで、オプションを指定しなくても、設定ファイルにあらかじめ指定しておけば、オプション付けをしなくてもよくなるんだ。もちろん、設定ファイルとは違う指定をしたくなったら、オプション指定するといい。優先度はコマンドオプションにあるからね。

mknmz は下記の順で設定ファイルを読み込むんだ。複数見つかった場合はすべて読み込む。

  • $(sysconfdir)/$(PACKAGE)/mknmzrc
    通常は /usr/local/etc/mknmz/mknmzrc
  • ~/.mknmzrc
  • -f, --config=FILE オプションで FILE に指定した mknmzrc

mknmzrc というファイルで、初期状態を指定しておくことができる。あらかじめサンプルが用意されていて、環境によって違うけど、通常は /usr/local/etc/namazu/ ディレクトリに mknmzrc-sample という サンプルファイルが用意されている。これを自分の作業領域にコピーして設定するんだ。

ところで、mknmz がデフォルトで参照にする設定ファイルは /usr/local/share/namazu/pl/conf.pl だ。mknmzrc を作成しているうちにうまくいかなくなったら、conf.pl を参考にしてみよう。

変数名 説明
$ADDRESS 管理者メールアドレスの設定
$HTML_SUFFIX HTMLファイルの拡張子を設定
$ALLOW_FILE 処理するファイルタイプを設定(正規表現)
正規表現で使われる語頭・語尾の ^ $ は不要。
$DENY_FILE 処理しないファイルタイプを設定(正規表現)
$DENY_FILE は -a と同時に使うと便利かも知れない。( .. を除く全てというような指定が可能)
$EXCLUDE_PATH 除外 path (正規表現)
$DIRECTORY_INDEX URL が / で終っている時に表示するファイル名。通常は index.html 。
$REMAIN_HEADER RFC 822 Header などのうち本文として検索出来るものを指定
$SEARCH_FIELD フィールド検索(「+subject: 検索語」のような形式)に使える項目を指定する
$META_TAGS 検索対象にするMETAタグを指定
%FIELD_ALIASES メール見出名の置換ルール
$NON_SEPARATION_ELEMENTS これらがあっても単語は切らない
$ON_MEMORY_MAX namazu は文書を次々と読んで、それらから、まとめてインデックスを作る。その作業は全て記憶域で行なう。その読んだ文書の大きさの合計が、この数字を越えると、一旦インデックスを書き出す。そうして空にしてから、また次を読む。この大きさと、必要な記憶域の大きさは、単調増加の関係にある。
$ON_MEMORY_MAX に設定する数字について shell で、limit という操作をして表示される中の datasize が適切でないと、この指定は意味を持たない。
記憶域は沢山あるという時には、良く分らなければ、unlimit datasize としておくのが良い。
$FILE_SIZE_MAX 対象にするファイルサイズの上限
$TEXT_SIZE_MAX 対象にするテキストサイズの上限
$WORD_LENG_MAX 対象にする単語の上限(単位:バイト)
%Weight スコアリングの点数
$INVALID_LENG これ以上の長さのタグはスコアリングから外す。
$MAX_FIELD_LENGTH (NMZ.field.* に保存する)文字列の大きさ (バイト)
$NKF NKF 起動法
$KAKASI KAKASI 起動法
$CHASEN ChaSen 起動法
$CHASEN_NOUN  
$WAKATI わかち書きに使用するプログラム(KAKASI/ChaSen)を指定

cron を使ってインデックスファイルの定期運用

インデックスファイルの作成に慣れたら、cron を使って定期的にインデックス作成をするように設定するといいね。

スクリプトファイルの作成

shの場所を見つけよう。例では「/bin/sh」。

% which sh
/bin/sh

vi エディタ(または任意のエディタ)を起動する。

% vi namazu_index.sh

スクリプトファイル(上記の例では"namazu_index.sh")を下記のように編集する。

#! /bin/sh

# ログを出力するディレクトリに移動
cd /usr/local/apache/var/index

# mknmz の起動(オプションはあくまでサンプル)
mknmz --exclude=/private -O ./ /home/httpd/html

cronの編集

次はcronの編集。

% crontab -e

エディタが起動し、cronの編集画面が表示される。

0 0 * * * sh /root/sh/namazu_index.sh

上記の例では、0時0分にスクリプトファイルを起動している。これで、日ごとにログファイルが出力されるようになる。


文書フィルタ

mknmz は対象ファイルの文書形式を自動で判別して、適切なフィルタ処理を行うんだ。たとえば、 HTML文書だと <title> の抽 出や、HTMLタグの除去を行う。この処理は $(datadir)/$(PACKAGE)/filter に置かれる文書フィ ルタによって行われるんだ。標準で用意されている文書フィルタは次の通り。

gzip.pl
gzipで圧縮されたファイルを扱う
必需品: gzip コマンド または Compress::Zlib モジュール
bzip2.pl
bzip2で圧縮されたファイルを扱う
必需品: bzip2 コマンド
compress.pl
compressで圧縮されたファイルを扱う
必需品: compressコマンド
deb.pl
debパッケージを扱う
必需品: dpkgコマンド
dvi.pl
dviファイルを扱う
必需品: dvi2tty, nkf
excel.pl
Microsoft Excel文書を扱う
必需品: xlHtml, lv (Excel 97/98文書の場合)
代替品: doccat
hnf.pl
ハイパー日記システム のファ イルを扱う
必需品: hnf フィルタは特殊。ハイパー日記システム・プロジェクトか ら Namazu for hns を入手する必要がある
hdml.pl
HDML文書を扱う
html.pl
HTML文書を扱う
mailnews.pl
Mail/News のファイルを扱う
man.pl
man を扱う
必需品: nroff または groff
注意: 日本語の man を扱うには -T nippon に対応した groff または jgroff が必要
mhonarc.pl
MHonArc のファイルを扱う
msword.pl
Microsoft Word文書を扱う (日本語版は Word 97, 98, 2000)
必需品: wvWare, lv
代替品: doccat
pdf.pl
PDF 文書を扱う
必需品: xpdf (バージョン 0.91 以上を推奨)に付属の pdftotextコマンド
注意: 日本語の PDF 文書を扱う場合、--enable-japanese で configure されたものが必要
postscript.pl
PostScript 文書を扱う
必需品: ps2textコマンド
powerpoint.pl
Microsoft PowerPoint文書を扱う
必需品: xlHtml に付属の pptHtmlコマンド, lv
代替品: doccat
rfc.pl
RFCのファイルを扱う
rpm.pl
RPMパッケージを扱う
必需品: rpm
taro.pl
一太郎 9, 10 の文書を扱う
必需品: doccat
tex.pl
TeXのファイルを扱う
必需品: detex

次の文書フィルタは Windows専用だよ。

ichitaro456.pl
一太郎 4, 5, 6 の文書を扱う
必需品: JSTXT
注意: JSTXT は MS-DOS用のツールです。
oleexcel.pl
Microsoft Excel文書を扱う
必需品: Microsoft Excel 97 もしくは 2000
olemsword.pl
Microsoft Word文書を扱う
必需品: Microsoft Word 97 もしくは 98 もしくは 2000
olepowerpoint.pl
Microsoft PowerPoint文書を扱う
必需品: Microsoft PowerPoint 97 もしくは 2000
oletaro.pl
一太郎 (バージョン 4 ~ 10) の文書を扱う
必需品: Microsoft Word 97 もしくは 98 もしくは 2000
olertf.pl
RTF (Rich Text Format) 形式の文書を扱う
必需品: Microsoft Word 97 もしくは 98 もしくは 2000

関連記事

Comment

コメントを残す

メールアドレスが公開されることはありません。

リズムファクトリーはホームページの制作会社です。
ホームページ制作に関するご要望・ご相談はこちらからどうぞ。