namazu 検索プログラム perl 版 (pnamazu) 説明書

pnamazu-2002.11.16 by furukawa@tcp-ip.or.jp
pnamazu-2006.02.28 by yw3t-trns@asahi-net.or.jp


はじめに

Namazu ML に於いて、 「プロバイダにある自分のページに検索エンジンを載せたい」 との声がありました。perl 版は、それに応えるべく、作られたものです。

よって、本来は、プロバイダにて cgi として動作させることを主な目的としています。(しかし、村下@池上通信機さんのご協力により、コマンドラインでも動くようになってきました。)

まず最初に、正規版の namazu のマニュアルを読んで下さい。 どっちみち、インデックスを作るためには読まなければならないでしょう。

perl 版の検索クライアントは、正規版の仕様に似せて作ってありますので、 多くの部分で正規版のマニュアルが通用します。 しかし、逆に言うと、似せてあるだけなので、細かい点では違いはあります。 それには、perl 版独自の改良もありますが、

さらには

もあるでしょう。お気づきの点は、 作者 または、 Namazu ML へどうぞ。修正されるかもしれません(「仕様」と言い張るかもしれません)。


これって、何をするもの?

Namazu のシステムは、大きく分けると、

から構成されます。pnamazu は、後者の代替品です。おそらく使われ方の多くは、

  1. web コンテンツを作りました。
  2. 自分の PC に namazu をインストールして、コンテンツの検索ができるようにしました。
  3. これは便利!
  4. じゃあ、自分の契約しているプロバイダ (や、レンタルサーバ) に転送して公開しよう!
  5. でも、自分のプロバイダ/レンタルサーバでは、 C コンパイルができないから、検索プログラムを置けない
  6. 仕方がない、pnamazu でも使うしかないか…

という感じだと思われます。


お知らせ

2001.11.30 のバージョンは、idxname を指定しない、デフォルトのインデックスを使う方法の検索ができませんでした。

2001.11.28 のバージョンは、namazu 2.0.8 同様、 cross-site scripting 問題が残っていました。

2001.11.03 までのバージョンは、namazu 2.0.7 以前と同様、 cross-site scripting 問題がありました。

2000.05.08 からは、何もしない状態では、後方/中間一致検索は、本家同様、 正規表現検索に変換して扱われることになりました。

わかち書きと併用するためには、bwnmz.pl を使って 後方/中間一致用のインデックス を作る必要があります。(インデックスのあるディレクトリで perl bwnmz.pl とするだけです)

1999.11.01 から 1999.12.07 の版では、 v1.3 形式の検索ができないバグがあることが分かりました。 現在は直っています

1998.06.17 から 1998.10.01 の版には、 and 検索のバグがあることが分かりました。1998.10.20 以降は直っています。


目次


perl 版について

perl 版は

「遅くてもいいから、なんとか動かしたい。動かすための敷居は低くしたい」

というポリシーで作られています。よって、正規の namazu の検索プログラム (C 言語版) に比べて、

といった利点があります、また、ディスク容量に制限があるプロバイダを考慮し、

をしています。(当然速度は遅くなります)

あたりまえですが、CGI が使えないプロバイダでは、やっぱり使えません。


とりあえず使うには

基本的には、次の手順でよいはずです。

  1. 検索インデックスを作る (正規版のマニュアルを見て下さい)
  2. pnamazu.cgi の 1 行目を、プロバイダの perl の位置に合わせて変更 する。普通は、
    #!/usr/bin/perl
    とか
    #!/usr/local/bin/perl
    になるはずです。利用するプロバイダから情報を得てください。 その際、perl のバージョンは 5 以上である必要があります。 (動作確認は 5.005 にて行なっています)
  3. pnamazu.cgi の名前を namazu.cgi に変更する。
  4. NMZ.* および namazu.cgi をプロバイダに ftp で転送する (正規版のマニュアルを見て下さい)

ちょっと詳しい説明

とりあえず使うだけならば、上の手順 でいいはずですが、インデックスやスクリプトを圧縮したい場合や、設定を変更したい場合、以下を読んでください。

配付ファイル一覧

perl 版特有の設定

perl 版特有の設定は、src/pconfig.pl というファイルで行ないます。 以下にその変数を示します。 一部のものは、namazu.conf / .namazurc / .pnamazurc といった設定ファイルにも書くことができます。

主な設定
$IntType

(プロバイダのマシンではなく) 検索インデックスを作ったマシンの整数タイプ。

(例)いわゆる普通の Windows マシンでインデックスを作った場合、 32bit の little endian なので 'V' を指定する

namazu 1.1.2 以降でインデックスを作った場合、'NMZ.le' または 'NMZ.be' というファイルが作られますから、それをプロバイダに転送すれば、 $IntType の設定は必要ありません。 ver 1.2 以降のインデックスを普通に使う時には、むしろ空文字列の ままにしないと、誤動作の原因になります。

配付時の初期設定:$IntType = '';

$Zcat

ディスク節約のために、インデックスやスクリプトを圧縮しておきたい場合、 実行時に解凍する必要がありますから、そのためのプログラムを設定します。

プロバイダのマシンでの zcat の位置を指定して下さい。 たいていの場合、

'/usr/bin/zcat'

とか

'/usr/local/bin/zcat'

といった場所にあります。 運よく、path の通った場所に あれば、単純に 'zcat' でもいい場合もあります。

注意すべき点として、例えば SunOS の /usr/ucb/zcat は、compress にしか対応していません。GNU の zcat である必要があります。 その意味では、gzip があれば、'gzip -dc' の方が分かりやすいかもしれません。 (普通は、gzip と GNU zcat の実体は同じものです)

配付時の初期設定:$Zcat = '/usr/local/bin/gzip -dc';

当然ですが、圧縮するために、ローカルマシンにも gzip が必要です。path の通ったところに置いて下さい。

$ZcatPri

インデックスを zcat で解凍する場合に、サーバに負荷がかかり過ぎるのを 防ぐため、優先度をこの値に下げます。

配付時の初期設定:$ZcatPri = 10;

$ScriptFileName

スクリプト自体を圧縮して実行する場合、$0 == '-' となるため、スクリプトが自分のファイル位置を知ることができなくなります。 その場合に設定して下さい。

Apache (全バージョンかどうかは知りませんが)では、環境変数 SCRIPT_FILENAME でスクリプトの位置が分かりますので、設定は不要です。

また、今のところ、この変数は、namazu.conf の位置を知るために使用しているだけなので、$NamazuConf に namazu.conf の位置を指定してあるか、または、namazu.conf を使わない場合、設定する必要はありません。

配付時の初期設定:$ScriptFileName = '';

$NamazuConf

namazu.conf の位置を明示したいときに設定します。

配付時の初期設定: $NamazuConf = '';

$ReniceTime, $RenicePri

検索のヒット数が多い、などの理由で、サーバに負担がかかるのを防ぐため、 一定時間が経過したら、setpriority で優先度を下げることができます。

$ReniceTime で、setpriority を実行するまでの時間、 $RenicePri で、setpriority で指定する優先度を指定します。 これらが、$ReniceTime が正の数で、かつ、CGI として実行しているときだけ有効です。 $RenicePri が負の場合、時間経過したところで終了します。

配付時の初期設定: $ReniceTime = 120; $RenicePri = -1;

$CmdLineArg

正規版の namazu 検索プログラムは、v1.2 から、コマンドライン実行時の 検索語とディレクトリの評価順が変わりました。それに合わせて、

'new' にすると、'key string' [index dir] の順、 'old' にすると、[index dir] 'key string' の順 に評価されます。

配付時の初期設定: $CmdLineArg = 'new';

%DbAlias

database の別名リストです。

%DbAlias = ('foo' => 'bar');

と書いておくと、dbname=foo というパラメータが渡されたときに、 bar というインデックスを見に行くようになります。

配付時の初期設定: %DbAlias = ();

@DbEnable

有効な database 名のリストです。 このリストが空でない場合、リストに無い database 名は無効になります。

配付時の初期設定: %DbEnable = ();

$RespTextOrig

応答の text に入れる検索式の初期値を設定します。 0 にすると、わかち書きなどの処理をした後の文字列を返します。 例えば、'*愛知大学*' を入力した場合、応答の text の初期値は '{ *愛知 大学* }' になります。これにより、検索プログラムが、 入力を、どう解釈したかが分かります。 1 にすると、入力をそのまま返します。

配付時の初期設定: $RespTextOrig = 0;

この設定は、設定ファイルにも

RespTextOrig 0

のように記述することができます。

$SplitLink

1 にすると、文書の存在するディレクトリにもリンクするように なります。 ただし、この場合、<A HREF="foo/bar">hogehoge</A> のうち、hogehoge は捨てられます。NMZ.f を加工している場合には、 注意が必要です。

配付時の初期設定: $SplitLink = 0;

$CacheSizeLimit

簡易 cache 機能 に使用するファイルサイズ の上限を設定します。
ただし、一度ファイルを作ってから、サイズ超過したら消す、 という順序の処理をしているので、一時的には、 この値を超えることがあります。

配付時の初期設定: $CacheSizeLimit = 4096;

$MakeSummary

簡易要約機能 を有効にする。
この変数を 1 にしても、NMZ.ri が無い場合には、通常通り、 NMZ.f から要約を読み込みます。

配付時の初期設定: $MakeSummary = 0;

この設定は、設定ファイルにも

MakeSummary 0

のように記述することができます。

$MakeGrep

grep 機能 の設定

'default'
コマンドラインで --grep==off とするか、 CGI 時の QUERY_STRING で grep=off としない限り表示
'option'
コマンドラインで --grep==on とするか、 CGI 時の QUERY_STRING で grep=on としたときに限り表示
その他
常に表示しない

配付時の初期設定: $MakeGrep = 'option';

この設定は、設定ファイルにも

MakeGrep option

のように記述することができます。

$MaxHit, $MaxFieldHit, $MaxMatch

検索時の各種制限値

$MaxHit
単語検索時の文書ヒット数の最大値
$MaxFieldHit
フィールド検索、タイムスタンプ検索時の文書ヒット数の最大値
$MaxMatch
正規表現、部分一致時の単語マッチ数最大値

配付時の初期設定: $MaxHit = 5000; $MaxFieldHit = 10000; $MaxMatch = 1000;

$PhoneEnable

CGI 動作時に、携帯電話モードを有効とするかどうか

'always'
常に有効
'auto'
自動 (相手を見て判断する)
その他
常に無効

配付時の初期設定: $PhoneEnable = 'auto';

$HWMode

ヒットしなかったひらがな語の扱い

分かち書きは、辞書によって行なわれますが、 ひらがな語は辞書にないので、うまく分かれないことも多いです。 これは、実際に存在しても、見つからないことがある、ことを意味します。

そこで、pnamazu では、ヒットしなかったひらがな語は、 演算対象から外すことができるようになっています。

'on'
常に演算対象とする (ある意味、正しい動作)
'off'
演算対象から外す
'wakati'
分かち書き中のみ演算対象とする

この設定ができる前の pnamazu の動作は、この設定が 'off' であるのと等価です。

配付時の初期設定: $HWMode = 'wakati';

$TitleFormat

Title の書き換えフォーマット

などの変数が使えます。

配付時の初期設定: $TitleFormat = 'pNamazu: ${key} / ${title}';

この設定は、設定ファイルにも

TitleFormat pNamazu: ${key} / ${title}

のように記述することができます。

$PhoneX0201

携帯電話モードでのカタカナの扱い

1 にすると、携帯電話モード時に、出力するカタカナを X0201 (いわゆる半角カナ) に変換します。

配付時の初期設定: $PhoneX0201 = 1;

この設定は、設定ファイルにも

PhoneX0201 1

のように記述することができます。

設定したら

src ディレクトリのファイルのうち、namazu.pl というファイルが main になります。これを namazu.cgi という名前に変更すれば、そのままで cgi として実行可能です。その際、require で呼ばれる全ファイルが必要です。 ftp でプロバイダに転送する際には、namazu.cgi と同じディレクトリに それらを全部転送して下さい。

makepnmz.pl について

ファイルの数が多いので、慣れないと、ftp の転送が面倒かもしれません。 (GUI な ftp クライアントを使っている人には関係無いでしょうが)

また、作者の個人的な趣味として、ソースを分割すると、開発には便利なのですが、 使うのにはちょっと面倒なのです。

そこで、makepnmz.pl というスクリプトを用意しました。

perl makepnmz.pl

とすれば、必要なファイルをマージして、pnamazu.cgi という一つのファイルを作ります。

ただマージするだけでは面白くないので、makepnmz.pl にはちょっと工夫があります。

perl makepnmz.pl [commands | PerlPath]

'/' で始まり、'perl' の文字列を含む引数は、プロバイダでの perl の位置と解釈されます。それ以外は command となります。command は複数指定可能で、その意味は次の通りです。
cgi
コマンドラインでしか使用しない部分はマージしない。 これにより、常に cgi として動作するようになります。
strip
コメントだけの行、行頭のスペースを削除、行のマージによりサイズを小さくする。
zcat
gzip で圧縮する。perl スクリプトは pnamazu.gz という名前に圧縮されます。 実行時に解凍して perl を起動するシェルスクリプトを生成します。 実行するには、'pnamazu.gz' も必要になります。

シェルスクリプトは、

#!/bin/sh
zcat pnamazu.gz | perl -

となりますが、このうち、perl の部分には引数の PerlPath (それが無ければ namazu.pl の一行目) が使われます。また、zcat には、pconfig.pl で指定した変数 '$Zcat' が使われます。

必要に応じて、$Zcat$ScriptFileName の設定をして下さい。

nobw
後方/中間一致検索 を使わない。その分、スクリプトは若干小さくなります。
noreg
正規表現検索を使わない
notim
タイムスタンプ検索を使わない
nocache
簡易 cache 機能を使わない
nosummary
簡易要約機能 およびgrep 機能を使わない
配付ファイルの pnamazu.cgi は
perl makepnmz.pl cgi strip /usr/local/bin/perl
として作成したものです。

注意:makepnmz.pl は、スクリプトを perl の文法的に解析しているわけではなく、 作者のプログラミングスタイル (単なる癖) に依存しています。 よって、スクリプトを改造してお使いになる場合には、makepnmz.pl は使わず、 分割されたファイルのままの方が無難です。

注意:以前の makepnmz.pl には、nofield という、「field 検索を使わない」 という選択肢がありましたが、現在は廃止されました。 v2 形式では、要約表示にも field 関係のルーチンを使用するためです。

ディスク容量を節約したい場合

注意:この機能は、最近は作者も全く使用していませんし、 メンテナンスもしていません。よって、動けばもうけもの、 くらいの状態になっています。 (というか、今にして振り返れば「何でこんなこと考えたんだろ」と思っているくらいです)

実際問題としては、ディスク容量を節約したいのは、プロバイダのディスク容量の残りが少ない場合だと思いますが、そのような場合はコンテンツの大部分が画像等のバイナリファイル (つまり検索対象外のファイル) だとすると、この機能を使いたいケースはあまりないのかもしれません。それはともかく…

もし、御利用のプロバイダで gzip や GNU zcat が使えるならば、インデックスやスクリプトを圧縮した状態で置いておき、実行時に解凍することができます。

まず、pconfig.pl の$Zcatを設定して下さい。

インデックスを圧縮する

インデックスファイルのうち、次の 5 つの拡張子のものは、圧縮ファイルを使用することができます。

    非圧縮時    圧縮時
    .h          .h.gz  または .hz
    .ii         .ii.gz または .iiz
    .i          .i.gz  または .iz
    .fi         .fi.gz または .fiz
    .f          .f.gz  または .fz

5 つ全部ではなく、一部だけを圧縮して置くことも可能です。 圧縮ファイルが無ければ、自動的に非圧縮ファイルを読みます。 ローカルマシンにて gzip を使って圧縮してください。

考慮すべきことは、

ということです。どのファイルを圧縮すべきか/すべきでないかは、個々のケースで違うと思います。

また、zcat を使って解凍することは、サーバに負荷をかけることになります。 プロバイダのサーバなど、多くの人の共有資源を使う場合には、この点も考慮 すべきです。pnamazu では、zcat を実行する際には、自分の優先度を下げる うにしています。

スクリプトを圧縮する

makepnmz.pl の zcat コマンドを使ってスクリプトを圧縮してください。cgi コマンドや strip コマンドと併用して、

perl makepmnz.pl zcat cgi strip /usr/local/bin/perl

などとすると、より効果的です。


コマンドラインで使う

perl 版はコマンドラインでも動くつもりで作られています。ただし、

コマンドラインで使う際の文字コード

出力する文字列については、環境変数を読んで、指定されたコードに変換して 出力します。そのルールはいいかげんで、


わかち書きについて

内蔵のわかち書き処理では、検索インデックス自身を辞書代わりに利用するため、 「文書群に存在する語群ときっかり同じ辞書を持った kakasi」 のような出力になります。つまり、本当に kakasi を呼び出した場合に比べると、辞書が小さくなったような動作になるので、やや精度が落ちます。

kakasi の標準の辞書に「大阪」「大学」「大阪大学」という語が有ります。

しかし、もし、語群に「大阪大学」が無く、「大阪」や「大学」があった場合、 検索インデックス (つまり内蔵わかち書き用の辞書) には「大阪」「大学」 はあるが、「大阪大学」は無い、という状態になります。

ここで、「大阪大学」を検索しようとすると、「大阪」と「大学」があれば、 ヒットすることになります。

もし正規の kakasi を呼び出していれば、「大阪大学」は、あくまでも「大阪大学」 であり、ヒットしない、という正しい結果になります。

ただし、これはヒットする文書が増える方向なので、実質的にはそれほど問題にはならないと思います。

内蔵わかち書き処理では、分けられた語をカッコで囲むようになっています。つまり、 「namazu ! { 愛知 大学 }」と扱われます。

注意: 以前は、namazu.conf で WAKATI を指定すれば、それを呼び出すように なっていましたが、現在は、常に内蔵のわかち書きを使います。


後方/中間一致検索

perl 版では、後方一致検索や、中間一致検索ができるようになっています。

まず、mknmz で検索した後、

perl bwmnz.pl [Options] [DbName]

とします。DbName を省略すると、カレントディレクトリの NMZ.* が使われます。 これにより、次のようなファイルが作られます。

NMZ.s および NMZ.si
1 バイト文字列用、後方/中間一致検索インデックス
NMZ.m および NMZ.mi
2 バイト文字列用、後方/中間一致検索インデックス

オプションとして '-s' をつけると NMZ.s と NMZ.si だけを作り、 '-m' をつけると NMZ.m と NMZ.mi だけを作ります。 (以降、NMZ.s, NMZ.si, NMZ.m, NMZ.mi の 4 つを指して 'NMZ.(m|s)i?' と表記します)

1 バイト文字列の検索には、2 文字以上必要です。 '*e*''*i' のような検索は、 それぞれ /e//i$/ のように、正規表現検索 として扱われます。

また、NMZ.(m|s)i? でなく、NMZ.w だけでも、 後方/中間一致検索ができるようになっていますが、 その場合、本家と同様、正規表現検索に変換されて処理されるので、 わかち書きとの併用はできません。

正規表現検索

検索文字列を '/正規表現/' のように、'/' ではさむと、正規表現による検索が可能です。(NMZ.w が必要です)

2 バイト文字列については、ちょっと細工をしています。perl の正規表現では、 '/[ア-オ]/' とやっても、 '/[\xa5\xa2-\xa5\xaa]/' と解釈されてしまうため、これを '/(\xa5[\xa2-\xaa])/' と変換するような細工をしています。従って、カッコの順番が変わってしまうため、 \1 のような表現は、使えません。

正規表現検索部分には、内蔵わかち書き処理は適用されません。 よって、'/知大/' で「愛知」「大学」への分割はできません。 後方/中間一致検索を使って、'*知大*' とすれば可能です。

また、正規表現検索は、インデックスに登録された全単語を調べるため、 遅くなります。よって、単純な '/foo$/''/bar/' といった検索は、後方/中間一致検索を使うことをお勧めします。

NMZ.w と NMZ.(m|s)i? について

後方/中間一致検索のためのインデックスとして、 NMZ.w を使う方法と、NMZ.(m|s)i? を使う方法がありますが、

ですので、両方あった方が、よいです。


フレーズ検索

検索語列を '{ 検索語列 }' や '" 検索語列 "' のように '{ }' や '"' で囲むと、 フレーズ検索が可能です。この検索のためには、インデックス作成に namazu 1.2.x 以上を使って、フレーズインデックス NMZ.p および NMZ.pi を作ることが必要です。 もし、これらのファイルが無い場合には、単なる and 検索として処理されます。

{ 制御 ( システム | system ) } { *学部 *学科 } { /(バ|ヴァ)イオリン/ 協奏曲 } といった検索もできます。

もう少し詳しく説明すると、演算子が無い検索語の並びは、通常は and 演算ですが、すぐ外のカッコが '{ }' だった場合には、phrase 演算として扱われる、という仕様になっています。

Namazu のフレーズ検索は、語の並びをハッシュ値として記録しています。 そのため、精度は 100% ではありません。しかし、仕様上、次のことが言えます。

カタカナフレーズモード

例えば「スパゲッティ・スクリプト」で検索した際に、内部的に { スパゲッティ ・ スクリプト } or { スパゲッティ スクリプト } or スパゲッティスクリプト と等価な検索をします。

本当は、 「スパゲッティスクリプト」で検索したら それを分割して扱う ようにできるとよいのですが、それをやると、分割の組合せを 試す負荷が大きくなるので、やめました。

カタカナフレーズモードは、デフォルトで on です。これをオフ にするには、パラメータに kp=off というのを入れてください。

'-' 演算子

これは not 演算子に似ていますが、

つまり「京都」「東京都」を両方含む文書に、前者はヒットせず、後者はヒット する、ということです。

CGI 変数 'opmode'

CGI 動作時の QUERY_STRING に opmode という変数があったら、

'or' の場合
演算子の無いものを or で扱います。また、従来通り、 それが { } で囲まれているときは phrase 演算し、 'and', 'or' といった演算子も、使えます。
'inside' の場合
単純な日本語の単語検索のときに、語の前後に '*' がついているものとして扱います。
例: 「京都」は「*京都*」と扱われます。
英数字については、この処理はされません。 従来通り '*' を明示しない限り、単語単位となります。
'forward' の場合
単純な日本語の単語検索のときに、語の後に '*' がついているものとして扱います。
例: 「京都」は「京都*」と扱われます。
英数字については、この処理はされません。 従来通り '*' を明示しない限り、単語単位となります。

利用法としては、例えば、NMZ.head に
<select name="opmode">
<option selected value="normal">すべての語を含む
<option value="or">いずれかの語を含む
<option value="inside">単語の一部でも有効
<option value="inside">先頭部分の一致でも有効
</select>
なんてのを入れておくことが考えられます。


複数インデックス対応について

pnamazu-98.07.30 からは、CGI として動作する際に、複数のインデックスが 使えるようになりました。

作者は、検索結果のソートには「新しい順」をよく使うのですが、 初期の Namazu では、この機能は、ファイル名を数値ソートすることで実現されており、 インデックスにはファイルのタイムスタンプが記録されていないので、 複数のインデックスでは、うまく働きませんでした。

そこで、正規版でサポートされるまでの「つなぎ仕様」として、タイムスタンプ だけを記録したファイルを作成することにより、時間によるソートができる、 というものを、作りました。

インデックスのあるディレクトリで

perl tmmnz.pl

を実行すると、'NMZ.t' というファイルができます。'earlier' または 'later' を指定した検索時に、'NMZ.t' があると、このファイルを使って時間ソートを 行ないます。

この機能は、正規版でサポートされるまでの、限定仕様のつもりでしたが、 現在では正規版も同じ仕様を採用しています。


(実験仕様)リモートインデックス対応について

というのを以前やっていましたが、あまりおもしろくないのでやめました。


簡易 cache 機能について

Namazu のアルゴリズムから言って、データの規模が増えても、検索時間は log(N) のオーダでしか増えませんが、フィールド検索と正規表現検索については、 総当たりで検査するため、それぞれ文書数、単語数に比例して時間がかかります。

これらについて、せめて再検索の際には時間が節約できるように、結果を cache するようにしています。

対象となるのは、

の部分です。

cache は、NMZ.cache.* というファイルに記録されますが、インデックスが更新 されたことを検知する機能は無いので、インデックスを更新したら、cache file は削除してください。そうしないと、古いインデックスによる cache を信じて しまいます。

cache にどのくらいのサイズを使うかは、pconfig.pl で設定できます。

cache を使うためには、CGI 実行時のユーザに、 インデックスのあるディレクトリを書きこみ可とするか、 あらかじめ NMZ.cache.0, NMZ.cache.1, ... をサイズ 0 で作成しておき、 それらのファイルに対して書き込み可とする必要があります。

qfield について

フィールド検索は、文書数に比例した時間がかかります。 これは、フィールドの値を 1 文書毎に 1 行づつ記録しているためです。 しかし、mailing list の検索などでは、 from や subject に同じ値の重複が多いため、 それらをまとめておくと、比較回数を減らすことができます。

そこで、tool2 ディレクトリに、nmz-qfield.pl というスクリプトを用意しました。例えば、

% perl nmz-qfield.pl NMZ.field.from

とすると、NMZ.qfield.from, NMZ.qfield.from.f, NMZ.qfield.from.fi という 3 つのファイルができます。

pnamazu では、これらのファイルを見つけると、こちらを使って、 検索時間を節約します。

注意: qfield ファイルでは、元データの先頭にある、'[mlname 001]' や 'Re:' などといった文字列は削除されます。これは、subject の検索について qfield の効果を出すためです。


簡易要約機能について

小さいファイルがたくさんあるような状況で、要約用のファイルにより、 内容を二重に持っているのに近いサイズになってしまうのが、 ちょっともったいなかったので、 要約を、検索時に元ファイルから作ることができるようにしてみました。

インデックスが v1.x 形式の場合

ファイル名は NMZ.r から読みとっていますが、任意の行を読むため、 NMZ.ri が必要になります。これは、

% perl linmz.pl NMZ.r

とすると作ることができます。

そして、NMZ.f, NMZ.fi を削除すると、簡易要約機能が働きます。 ただし、削除した状態で、インデックスの追加をしようとすると、mknmz がエラー終了してしまいます。

% rm NMZ.f NMZ.fi
% touch NMZ.f NMZ.fi

としておくとエラーは出なくなるようですが、 もちろん、この場合、NMZ.f は正しくありません。 間違った NMZ.f が存在すると、それを元に、間違った要約を出力してしまいますので、

インデックスが v2 形式の場合

ファイル名は NMZ.field.uri から読みとりますので、NMZ.ri を作る必要はありません。

pnamazu では、REPLACE の処理などを、あまり真剣にやっていないので、CGI として使ったときにちゃんと動くかどうかは、よく分かりません。 (私自身は、この機能をコマンドラインでしか使わないので)

なお、この簡易要約機能では、ファイルは基本的に mail/news であるという仮定で扱っています (mknmz から、一部のコードをもらっています)。 他の形式のファイルでは、良い出力にならないかもしれません。

grep 機能について

検索結果のファイルが読める状態にあれば、grep のように、語の存在する行を表示します。 ただし、あまり凝った処理はしていないので、行をまたいだ語や、フィールド 検索には、対応していません。


タイムスタンプ検索について

検索式に、+[日付] という形式を使うことにより、NMZ.t に記録されている、 タイムスタンプによる検索ができます。

また、+[日付,日付] とすることにより、タイムスタンプの範囲を指定して、 検索することができます。ここで、範囲のどちらかの日付を省略することに より、「〜以前」「〜以降」も表現できます。

日付は、基本的には、'YYYY.MM.DD' という形式で指定しますが、項を略す ことができます。例えば、年を省略したい場合は、'.MM.DD' とします。 その場合、検索が無意味にならないような値が補われます。

日付の先頭に '+', '-' をつけることにより、相対指定になります。 基本的には、検索を行なった日から、過去に遡る方向に計算しますが、 +[日付,日付] 形式で、右側の日付に '+' を使った場合には、左側の日付 から加算する方向になります。

検索の例として、

+[1999.1.1,1999.1.15]
1999年1月1日〜1999年1月15日
+[1999.4,]
1999年4月以降
+[,1999.4]
1999年4月以前
+[.2.1]
直近の2月1日 (年は省略可)
+[-5,+.6]
今日の 5 年前から 6 ヶ月間
+[-..7]
最近 1 週間

といったことができます。 分かりにくいですが、相対指定や、項の省略などをした場合でも、検索結果では、 範囲を明示するようにしていますので、いろいろ試してみて下さい。

注意:


インデックスの形式 (v1.3/v1.4/v2) について

Namazu では、インデックスの形式に大変更がありました。 pnamazu では、v1.3 以前 / v1.4 / v2 以降 のどの形式でも扱うことができます。 その際、'NMZ.wi' というファイルがあれば v2 形式、それが無い場合、 'NMZ.h' というファイルがあれば、v1.3 形式、無ければ v1.4 形式と 認識します。よって、「v1.4 形式なんだけど、昔の残骸として NMZ.h が残っていた」 なんて場合には誤動作しますので、御注意ください。

複数のインデックスから検索する際に、バージョン形式が混在していても大丈夫なはずですが、テストは十分とはいえません。

注意: v1.4 は、正式なリリースではなく、インデックス形式も一時的なものです。
v2 とは、正確には、"v1.9 以降" を指します。

(おまけ)インデックス >-< テキスト双方向変換サブルーチン群について

インデックスはバイナリファイルなので、下手にいじると、位置が変わって、 おかしなことになります。

よって、ユーザがインデックスを加工したいと思っても、簡単にはできません。 もしやるとしても、いちいち専用のツールを作っていると大変なので、

(1)
まずテキストに変換して
(2)
それを加工して
(3)
インデックスを構築し直す

という手順を踏むことにして、(1) と (3) が用意されていれば、(2) は、利用 者が勝手に作ることができるようになります。

そこで、インデックスをテキストと双方向変換するサブルーチン群 nmztxt.pl というものを作ってみました。サポートしているのは、

などです。

また、これを使ったサンプルとして、NMZ.f の要約に、Keyword を付加する、 kwnmz.pl というものを作ってみました。

本当は、インデックスを読みながら処理をして、 その場で書き出した方が速いのですが、汎用性を考えて、 いったんテキストに落とすようになっています。 速度と汎用性を両立できる、もう少しいい方法があれば、考えたいと思います。

他に、次のようなサンプルを添付しています。

13to14.pl
v1.3 形式のインデックスを v1.4 形式に変換する
addnew.pl
最近 n 日以内に更新したファイルについて、要約に 'New!' などの文字列を付加する
msgid.pl
要約の HREF の中身を 'news:....' に置喚する。 NetNews の記事をインデックスした場合に有用。
fmlget.pl
要約の HREF の中身を 'mailto:...' に置喚する。 fml を使っていて、「Web で検索はできるけど、もとのファイルは公開しない」 という運用をしている場合に有用

注意: nmztxt.pl は、v1.3/1.4 形式しか扱えません。 v2 形式については、nmzidx.pl というものを用意していますので、そちらをお使い下さい。

これを使ってみよう、という奇特な方へ!

まだ作ったばかりで、実績が十分とは言えませんし、バグがあると、 インデックスが壊れてしまう、危険な処理ですから、 バックアップをとってから使うことをお勧めします。

インデックスファイルアクセスサブルーチン群 nmzidx.pl について

v2 形式用には、インデックスファイルアクセスサブルーチン群を用意しました。

まだ、仕様が固まっていないところがあります。現時点の使い方の簡単な説明は、 nmzidx.txt を見てください。

最終的には、検索プログラムを自作できる部品を提供できれば、と思っています。 tool2/search.pl にそのサンプルがあります。


cgiwrap 対策について

web server で cgiwrap が動いている場合、cgi に制御が移った時点で、 SCRIPT_NAME が書き換えられた状態になっているようです。 そこで、次のような対策をしています。


replace について

pnamazu では、申し訳ないことに、replace の設定が、 大変分かりにくくなっています。 本家同様、「"replace" 変換元 変換先」と書くことは変わり無いのですが、

  1. 各項をタブで区切った場合、変換は単純に文字列の置換となります。
  2. 各項をスペースで区切った場合、変換には正規表現が用いられます。
  3. 単純置換と正規表現置換の両方にマッチする場合、単純置換が優先されます。
  4. 複数の単純置換にマッチする場合、最長一致したものが優先されます。
  5. 複数の正規表現置換にマッチする場合、後に設定したものが優先されます。

携帯電話モードについて

携帯電話モードでは、次のような動作をします。

  1. NMZ.head の代わりに NMZ.phone を (あれば) 読む
  2. NMZ.body を表示しない
  3. 検索文字列の日本語コードを Shift_JIS として扱う (いわゆる半角カナも OK)
  4. 出力の日本語コードを Shift_JIS とする
  5. 検索結果では form を表示しない
  6. 参考ヒット数表示しない
  7. ヒット数がゼロでも NMZ.tips を表示しない
  8. 結果表示を 10 件固定とする
  9. result を 'phone' 固定とする。(NMZ.result.phone を読む)
  10. page list は 'next' のみ (accesskey="#" つき)
また、これに関係して、
  1. NMZ.result.* に '${namazu::accesskey}' や '${summary::size=XX}' と書ける
  2. 私が確認に使用した NMZ.phone, NMZ.result.phone をサンプルとして同梱
となっています。このモードを使うには、
  1. NMZ.phone を NMZ.head にならって編集する (idxname など)
  2. NMZ.phone を NMZ.head と同じ場所に置く
  3. NMZ.result.phone を他の NMZ.result.* と同じ場所に置く

としてください。

注意: このモードは、まだ試作段階です。

出力フォーマットファイルについて

NMZ.head.* と同じディレクトリに、NMZ.format.* というファイルを置くと、 NMZ.head と NMZ.foot の間の検索結果出力をかなり自由に設定できるようになります。 サンプルを template/NMZ.format.* に入れてあります。 書式は NMZ.format.ja を見ていただけると分かると思います。

注意: このモードは、まだ試作段階です。

wrapper を書きたい方へ

pnamazu は本当に申し訳ないほど汚いスパゲッティ・スクリプトなため、 何か変更しようと思ったら、改造するよりも、wrapper を書いて出力を加工するほうが現実的です。

ですが、その wrapper を perl で書くと、毎回 perl を 2 つ起動してしまうことになります。

そこで、&print というサブルーチンを定義した上で pnamazu を require したら、出力する代わりに、そちらのサブルーチンに出力文字列を渡すようにしました。

つまり、普通、wrapper は、


    open(FH, "pnamazu.cgi|");
    while (<FH>){
        加工;
        print;
    }

のように書きますが、これを

    sub print{
        加工
        print;
    }
    require "pnamazu.cgi";

と書けるようになっています。

でも、pnamazu の汚さに変わりはありませんので、変数名の衝突の可能性は常にあります。 御注意ください。


履歴

#       '+': 新規仕様
#       '?': 試験的仕様
#       '-': 仕様の削除
#       '*': 本体以外の仕様
#       '!': 修正
# 2006.02.28
#    ! Directory Traversal 問題の対策
# 2002.11.16
#    ! 結果の文字コードとヘッダの charset 指定が一致しないことが
#      あったのを修正 (Thanks to 岡田憲己さん)
#    + NMZ.head.* が XHTML の場合でも、それなりに動くようになった
#      (Thanks to 岡田憲己さん)
#    ! 出力結果に意味不明のタグが出ることがあったのを修正
#      (Thanks to 岡田憲己さん)
# 2002.09.21
#    ! 複数インデックスを検索して、NMZ.format.ja を使用した際に、
#      表示範囲 (xx 件 - yy 件) の計算がおかしかったのを修正
#    + --no-reference オプションを実装 (Thanks to 野田欣宏さん)
#    * tiny_mknmz.cgi が、hns の board.txt を読むようにした
#    * tiny_mknmz.cgi が、hns の GRP 指定したセクションをインデックス
#      に含めないようにした
#    ! grep 機能において、日記ファイル (*.hnf) で GRP を見つけたら、
#      それ以降を読まないようにした
#    ! replace がうまく動かないことがあったのを修正
#                                      (Thanks to Hiroto TANOUE さん)
#    ! 出力の html 文法エラー、typo など修正 (Thanks to 岡田憲己さん)
#    * tiny_mknmz.cgi で、対象から外すディレクトリを
#      設定できるようにした (Thanks to KONNO さん)
#    + 携帯電話モードでは、カタカナを X0201 に変換できるようにした
# 2002.03.27
#    ! NMZ.format.ja の中の説明について、typo を修正、および、
#      役立つコメントを追加 (hiro さん Thanks)
#    + NMZ.format.ja で eval が使えるようにした
#    + NMZ.format.ja で使える変数を追加
# 2002.03.23
#    + NMZ.format の変数として、検索時間、日時を出力できるようにした
#    + NMZ.result に ${field::noescape} と書くと、gt, lt, amp, quot 
#      の escape をしないようにした (Thanks to 北川風太さん)
#    + title の書き換えが、pconfig.pl または設定ファイルで
#      できるようになった。(Thanks to 岸田祐和さん)
#    * nmz-qfield.pl というツールを同梱
#    + NMZ.qfield.* というファイルを使い、フィールド検索が少し速くなった
#    ! 出力の html 文法エラー、typo など修正 (Thanks to NORI さん)
#    ! NMZ.format をもう少し根気よく探すようにした (Thanks to 鈴森康弘さん)
#    ! PATH_INFO に SCRIPT_NAME のフルパスがセットされるのは
#      IIS だけではないらしいので、対応 (Thanks to 新谷円香さん)
# 2001.12.01
#    ! idxname を指定しない、デフォルトのインデックスを使う方法の
#      検索ができなかったのを修正 (hiro さん Thanks)
# 2001.11.30
#    ! さらなる cross-site scripting 対策
#    ! index が見つからない時に、関係ない index を使うことがあったのを修正
# 2001.11.28
#    ! replace で \1, \2, ... が使えるようにした (Thanks to 佐久間浩彰さん)
#    ! IIS の PATH_INFO に SCRIPT_NAME のフルパスがセットされること
#      があるようなので、対応 (Thanks to Masahiko Sunami さん)
#    ! cross-site scripting 問題を修正
# 2001.11.03
#    ! 出力を search-s に合わせた
#    * tiny_mknmz.cgi がハイパー日記システムに対応
# 2001.09.03
#    * tiny_mknmz.cgi の速度改善、更新処理、時間制限設定
# 2001.08.29
#    ! grep 機能にて '<', '>', '"', '&' を含む語がマッチしなかった
#      のを修正。(Thanks to 永田@福岡大学さん)
#    ! ${summary::size=XX} を簡易検索機能にも効くようにした
#    ! $RespTextOrig = 1 のときに、key が
#         空文字列だとフォームが出力されない
#         '<', '>', '"', '&' を含むと、フォームに検索式が表示されない
#      のを修正 (Thanks to 佐久間浩彰さん)
#    ! マニュアル中で、v1 用と v2 用が混ざっていた部分を修正
#       (Thanks to 上原善哲さん)
#    + tiny_mknmz.cgi というツールを同梱
# 2001.06.27
#    ! print サブルーチンを定義されているときに、最後に undef
#      を渡すようにした
#    ! submit=jump の時に、検索結果が 0 件だと、サーバエラーに
#      なるのを修正 (hiro さん Thanks)
# 2001.06.26
#    + (ちょっとだけ) wrapper をやりやすくした
#    + カタカナフレーズモード
#    + sort パラメータに fstat:NAME と書くと NMZ.fstat.NAME という
#      ファイルを読むようにした
#    + ソートして順位が 1 位になった URI に直接飛べるようにした
#    + (遅ればせながら) tfidf に対応
#    + 出力フォーマットに #include と書けるようにした
# 2001.06.01
#    + hns に ad hoc に対応
#    + sort パラメータに +field:FIELDNAME と書くと、score に field
#      の値を加算するようにした (Thanks to 北川風太さん)
#    + NMZ.result.* に ${namazu::idxdir} や ${namazu::docid} と
#      書けるようにした
#    + 出力フォーマットを NMZ.format.* で指定できるようにした
# 2001.03.09
#    * tool2/nmzcheck.pl を同梱。インデックスの文字化け、ftp 転送などに
#      よるエラーなどをチェックします
#    * tool2/nmz-mew-summary-fixer.pl を同梱。mew-nmz を使っていて、
#      sort や pack したためにデータとインデックスの対応がとれなく
#      なった状態を修復します
#    * 「履歴」を namazu.pl から history.txt に移動
#    + opmode に 'forward' を新設
#    ! grep 機能時に、2 行にまたがるメールヘッダの処理を修正
#    ! default の EmphasisTags が namazu と異なっていたのを修正
#      (Kenji さん Thanks)
# 2000.12.10
#    ! Template のディレクトリに NMZ.result.* があると、v1.3 での表示が
#      うまくいかなかったのを修正
# 2000.11.21
#    ! .namazurc の Replace (スペース区切り) が、大文字・小文字を区別
#      しないようにした (Thanks to 山下誠二さん)
#    ! いくつかのオプションを C 言語版に合わせた
# 2000.11.11
#    ! cgi 動作時に、2 バイト文字でフィールド検索できなかったのを修正
#      (Thanks to 山中茂樹さん)
#    ! .namazurc 中の Template 行の指定ディレクトリからインデックスを
#      読もうとしてしまうことがあったのを修正 (Thanks to 山中茂樹さん)
#    * ツールをいくつか追加
#       (namazu-devel-ja#868, namazu-users-ja#1055, 1064, 1067 参照)
#    ! コマンドラインから --help などとして実行する際、出力文字コード
#      の判定処理をしないまま表示していたために、ヘルプメッセージが
#      文字化けしていたのを修正 (Thanks to 山下誠二さん)
#    ! --output オプションが無かったのを修正 (Thanks to 山下誠二さん)
#    ! フィールド検索時に、フィールド名を小文字に変換していなかった
#      のを修正
# 2000.10.07
#    * tool2/ ディレクトリに lnnmz.pl というツールを同梱。html 文書中の
#      リンクを抜き出して、NMZ.field.link を作ります。
#      (Osamu Okano さんの御提供です。Thanks!)
#    ! 検索結果のキーワード強調表示が、summary にしかなされていなかった。
#      タイトルも対象にするように修正 (Thanks to 横山則夫さん)
#    ! 分かち書きが起きたときに、キーワード強調処理をフレーズ単位にした。
#      今までは単語単位だった (Thanks to 横山則夫さん)
#    ! 「ヒットしなかったひらがな語は、演算対象としない」仕様を、設定で
#      切り替えられるようにした (Thanks to 横山則夫さん)
#    ! glob を呼ばないようにした (Thanks to Matsuoka Tetsuya さん)
#    ! 簡易キャッシュが効かないことがあったのを修正
#    + NMZ.result.* に ${namazu::idxname} や ${namazu::query} と書ける
#      ようにした
# 2000.09.22
#    ! NMZ.head.* 中の {cgi} の置き換えに REQUEST_URI を使っていたが、
#      これが無いと置き換えできないので、SCRIPT_NAME を使うようにした
#      (Thanks to Matsuoka Tetsuya さん)
#    ! ドキュメント中の記述を「検索クライアント」から「検索プログラム」
#      に変更
# 2000.09.16
#    ! 複数インデックス検索時に、親ディレクトリで NMZ.head が見つからない
#      と、各インデックスのディレクトリのものを複数表示してしまうのを修正
#      (Thanks to 横山博彦さん)
#    ! .namazurc の Template 行を読んでいなかったのを修正
#      (Thanks to 横山博彦さん)
# 2000.09.08
#    ! バグ修正 (Thanks to Matsuoka Tetsuya さん)
# 2000.08.30
#    ! QUERY_STRING が空のときは、NMZ.head.* のデフォルト値を書き換えない
#      ようにした (Thanks to 田辺晶史さん)
#    ! subquery が query を上書きしていたのを修正 (Thanks to 田辺晶史さん)
#    + NMZ.result.* に ${summary::size=XX} と書けるようにした
#    + user agent が携帯電話のときは、検索文字列を Shift_JIS として
#      扱うようにした
# 2000.06.19
#    * QandA.html を同梱
#    + 携帯電話モードを試作
# 2000.06.08
#    * 附属ツール bwnmz.pl, tmnmz.pl が動かなくなっていたのを修正
# 2000.05.26
#    + 演算子 '-' を新設
#    + CGI 動作時の演算モードとして opmode という変数を新設
#    + 検索時の制限値を導入
#    + namazurc の EmphasisTags に対応したつもり (いいかげん)
#    ! Replace\t が、最後のものしか有効でなかったのを修正
#      (Thanks to 良井竜さん)
#    ! ドキュメントの不備を修正
#      (Thanks to 本橋誠司さん、小関吉則さん)
#    ! NMZ.head などを読むときに、nkf -Z1 相当の処理をしていたのをやめた
#    ! 検索文字列を EUC-JP 以外で送信するブラウザから、複数インデックス
#      を検索したときなどに、文字化けするケースがあったのを修正
#      (Thanks to 本橋誠司さん)
# 2000.05.21
#    ! Win 上のサーバで CGI として動かなかったのを修正
#      (Thanks to 横山博彦さん)
# 2000.05.18
#    ! 前方一致検索に失敗することがあったのを修正
# 2000.05.17
#    ! META タグを挿入して、文字コードを明示するようにし、CGI 動作時の
#      デフォルト出力コードを ISO-2022-JP に戻した
#      (Thanks to 横山博彦さん)
#    ! Win 版からインデックスを持ってくると、編集などによって、
#      NMZ.{head,body,..}.ja の文字コードが Shift_JIS になったり、
#       混在しがちになることに対応 (Thanks to 横山博彦さん)
#    ! namazurc が複数見つかるときの優先順位が好ましくなかったのを修正
#      (Thanks to 横山博彦さん)
#    ! NMZ.result について、必ず英語のものが使われていたのを修正
#      (Thanks to 横山博彦さん)
#    ! replace を設定した状態で、+field:uri がうまくいかないことがあった
#      のを修正
# 2000.05.08
#    ! 簡易要約機能が有効になっていないと grep 機能が働かなかったのを修正
#    ! NMZ.[ms]i? が無いときの後方・部分一致検索の動作を、本家と同じに
#      した(わかち書きをやめた)。また、簡易キャッシュを有効にした。
#    ! 複数インデックス検索時に、NMZ.{head,foot}.* をもう少し根気よく
#      探すようにした (Thanks to 小関吉則さん)
#    ! 正規表現検索が、うまくいかないことがあったのを修正
#    + pnamazu 用の NMZ.tips.ja, NMZ.body.ja を同梱
#    + HTTP_ACCEPT_LANGUAGE を見るようにした。
#    ! 仕様の整理、バグ修正など
# 2000.02.12
#    + cgiwrap 対策 (Thanks to 田辺晶史さん)
#    - makepnmz.pl で 'nofield' を廃止した (Thanks to 小関吉則さん)
#    ! v1.3 形式の検索ができなくなっていたのを修正 (Thanks to 鶴岡英二さん)
# 1999.12.07
#    ! コマンドラインで veryshort の出力を修正
#    + 要約を検索時に作成するときに、grep 的動作もできるようにした
#    + インデックスより古い簡易キャッシュファイルは作りなおすようにした
#    * nmzidx.pl の仕様検討中
#          -> 検索クライアント自作のためのサンプル search.pl を添付
# 1999.11.01
#    + v2 形式に対応 (自動判別)
# 1999.07.04
#    + 要約を検索時に作成することもできるようにした
#    ! フレーズ検索に失敗することがあったのを修正
# 1999.05.11
#    ! 1 文字のみの中間/後方一致は、正規表現で検索するようにした。
#    + タイムスタンプ検索
# 1999.04.06
#    ! フィールド検索に "..." を使うパターン (+date:"Mar" など) が
#      うまくいかなかったのを修正
#    ! わかち書きができないケースがあったのを修正
# 1999.03.09
#    ! わかち書きができなかったときに、エラー終了するバグを修正
#    ! 複数データベース検索でフィールド/正規表現のキャッシュが有効の
#      ときに、キャッシュが他のデータベースに効いてしまうバグを修正
#    * url を "mailto:MlAdrs@domain?body=#get XXX" に変更するスクリプト
#      fmlget.pl を添付
#    * 13to14.pl で、NMZ.{keys|total} を更新するようにバグ修正
# 1999.03.02
#    + 簡易 cache 機能
#    + v1.4 形式に対応 (自動判別)
#    * nmztxt.pl も v1.4 形式に対応 (自動判別)
#    * v1.3 形式を v1.4 形式に変換するスクリプト 13to14.pl を添付
#    * HREF の中身を "news:..." の置き換えるスクリプト msgid.pl を添付
#    * 最近 n 日以内に更新したファイルの要約に文字列を付加するスクリプト
#      addnew.pl を添付
#    * kwnmz.pl で、キーワードの評価がおかしかったのを修正
# 1998.12.16
#    ! 一度に 2byte 文字列の正規表現検索を 2 つ以上しようとすると、
#      2 つ目以降が見つからないバグを修正
#    * nmztxt.pl が異様にメモリを喰うのを修正
#    * nmztxt.pl が、NMZ.field.* を .BAK, .BAK.BAK … と増殖させてしまう
#      不具合を、塩崎@ascii さんのパッチによって修正
#    * kwnmz.pl で、キーワードを EUC でセーブしていたのを修正
# 1998.11.20
#    ! and 検索ができないケースがあった
#    * nmztxt.pl を使う際、他にも db.pl などを require しなければならなかった
#      のを改め、nmztxt.pl だけ require すればよいようにした。
#    * gcnmz.pl は、本家の src/ に昇格することになった。
#    * nmztxt.pl を使ったサンプルとして、gcnmz.pl に代わり、
#      要約にキーワードを追加するスクリプト kwnmz.pl を添付
#    + subquery 対応
#    + 森本@イマジカさんのパッチをもとに、文書の存在するディレクトリ
#      へもリンクできるようにした
#    ! 村下@池上通信機さんのパッチをもとに、LANGUAGE 関連の設定を
#      v1.3.0.0 的にした
#    + [1][2]... の前後に [prev] [next] のリンクをつけた
# 1998.10.01
#    + field 検索に対応
#    * データベースファイルを、テキストファイルと相互変換する
#      サブルーチン群 nmztxt.pl を作った
#    * nmztxt.pl を使ったサンプルとして、データベースのゴミ掃除をする
#      スクリプト gcnmz.pl を添付 (v1.3.* 以降用)
#    + 正規表現の変換処理を、かなりマシにした
#    - 正規表現検索に NMZ.(m|s)i? を使うのをやめた
#    + NMZ.w が無くても、正規表現/後方/中間一致検索ができるようになった
#      (NMZ.i, NMZ.ii を使う -> ただし、遅い)
#    ! 環境変数 NAMAZUCONF & NAMAZUCONFPATH を読んでいなかったのを修正
#    + POST Method でも検索できるようにした
#    ! 初期状態でリモートアクセスを無効にしたつもりが、なっていなかった。
#      ($RemoteEnable という変数は用意していたが、用意しただけだった)
#    - kakasi を呼ぶのをやめた (常に内蔵のわかち書きを使う)
# 1998.08.31
#    + NMZ.w を使っても、後方/中間一致検索ができるようになった
#    ? dbname=http:// とすると、他の host へ検索結果を聞きに行くようにした
# 1998.07.30
#    + 複数の dbname に対応
#    + タイムスタンプを記録した 'NMZ.t' というファイルがあれば、
#      本当の時間ソートができるようにした。
#    * そのためのデータベース作成スクリプト 'tmnmz.pl' 添付
# 1998.06.23
#    ! 正規表現検索を同時に 2 つ以上したときの、参考ヒット数が間違って
#      いたのを修正。
#    ! 正規表現検索が、ちょっとだけ高速になったかも
#    + .ja や .en といった言語指定 suffix のついたファイルを読むようにした
#    ! コマンドラインでの引数を v1.2 以降の順序で読めるようにした。
# 1998.06.17
#    * wakati.pl < filename ができなかったのを修正
#    + 村下@池上通信機さんのパッチをもとに、LANGUAGE および veryshort
#      に対応
#    ? 正規表現に対応した。
#        2 バイト文字列はコンバートする
#        NMZ.w があれば、それを使う
#    + フレーズ検索対応
# 1998.05.14
#    * サブルーチンを流用して、わかち書きスクリプト (wakati.pl) および、
#      そのためのデータベース作成スクリプト (wktndx.pl) を作った
#    ! wsearch.pl の中で unsignedcmp を使っていたが、ここでの比較は、
#      1 バイト文字同士または 2 バイト文字同士だから、実は単純な cmp
#      でよいのではないか、と思い、unsignedcmp を使わないようにした
#      これで問題なければ、ちょっと速くなるかも
# 1998.05.06
#    ! 圧縮したデータベースが読めなくなっていたのを修正
#    - カタカナ語の中間一致検索を廃止
#    + 1 バイト文字列の後方/中間一致検索ができるようにした
#    * 中間一致検索用データベース作成スクリプトを統一 (bwnmz.pl)
# 1998.04.27 (proto)
#    + 前方/中間/後方一致の展開結果を表示するようにした。
#    ! バグ修正
#    ? 一定時間経過したら、renice で priority を下げられるようにしてみた
#    * NMZ.m の効率を少し上げた (mbnmz.pl)
#    ! 細かい改良
# 1998.04.21 (proto)
#    ? 2 バイト文字列の後方/中間一致検索ができるようにした
#    * そのためのデータベース作成スクリプト 'mbnmz.pl' 添付
# 1998.04.17
#    ! 検索結果が 0 件でも 1 件と表示されていたのを修正
# 1998.04.16
#    ! 前方一致検索ができなくなっていたのを修正
#    ! 単語分解がうまくいかないケースがあったのを修正
#    ? ひらがな語の扱いを見直し
#    ? カタカナ語に限り、中間一致検索ができるようにした
#    * そのためのデータベース作成スクリプト 'ktnmz.pl' 添付
# 1998.04.09
#    + NMZ.(be|le) に対応した。
#    * それによって普通に使う分には設定を変更する必要は無くなったこと
#      に伴い、配付ディレクトリ構造などを見直し
#    ! ちょっとバグ修正
#    * 大幅にドキュメント充実
#    + NMZ.slog を残すようにした
# 1998.03.25
#    + 村下@池上通信機さんのパッチをもとに、コマンドライン
#      から使えるようにした
#    ? namazu.conf で指定されていれば kakasi を呼べるようにしてみた
#    ? ソースを分割した
#    * マージツール (makepnmz.pl) を作成
# 1998.03.16
#    + 検索式が使えるようになった
#    + 圧縮したデータベースが使えるようになった
#    ! 全体的にコード見直し
# 1998.03.06
#    + 要約表示の ON/OFF を切り換えられるようにした
#    + NMZ.lock を見るようにした。
#    ! 前方一致検索のバグを直した
#    ! 大文字小文字が区別されていたのを直した
#    ! 複合語処理は日本語のみに適用するようにした
#    ! 整数のタイプを変数にした
#    ! その他、細かいバグ修正
#    + 村下@池上通信機さんのパッチをもとに、表示件数指定
#      および dbname 指定をできるようにした。
# 1998.03.04
#    + 初版

その他

多くの環境で動いて欲しい、と思ってはいますが、 実際に多くの環境でテストしたわけではありません。 また、この説明書も、分かりにくかったり、 環境によっては違う手順が必要だったりするかもしれません。 今後は、文書の充実も、やっていきたいと思っています。

配付条件などは、基本的に正規版 namazu と同じとします。 無保証ですので at your own risk にて使って下さい。 改造などしていただくことは構いません。 というより、改造しやすいように作ろうと思っていたのですが、 結果的には非常に読みにくいスクリプトになってしまいました。 すみません。 有用な改造は取り込みたいと思いますので、お知らせ下さい。

「そのうち、最初から書き直して、もっと美しいスクリプトにしよう」という 気持ちもあったのですが…

高林さんが「将来のバージョンは、クライアントも perl で書く」 と表明なさっています。よって、pnamazu の (存在意義という観点での) 寿命は、 それほど長くないことでしょう。 すると、現在の pnamazu は、作者が個人で使えれば十分になるので、書き直すのはやめました。

(1999.11.01 追記)
nmzidx.pl では、今後、検索して [文書, スコア] のリストを出力するところまでは、できるようにするつもりです。
そして、それに、user interface をつけたら、新しい perl 版検索クライアント ができるな、という気持ちになりました。それがいつになるかは分かりませんけれども。

(1999.12.07 追記)
その第一歩として、nmzidx.pl に基本的な機能を装備し、使い方のサンプルとして tool2/search.pl というものを用意してみました。


furukawa@tcp-ip.or.jp