全文検索システム Namazu の perl 版の検索プログラムです。

2006.02.28 までのバージョンには、cross-site scripting 問題が残っていました。 2006.12.23 にバージョンアップしてください。

2002.11.16 までのバージョンには、Directory Traversal 問題がありました。
2001.11.28 までのバージョンは、cross-site scripting 問題が残っていました。
2001.11.30 は、idxname を指定しない、デフォルトのインデックスを使う方法の検索ができませんでした。

perl で書かれていることを生かして、正規版にはない特長を備えています、 と言いたいところですが、その特長は、どんどん失われつつあり、 遅さだけが残った、という気もしています。

C コンパイルしなくていい

ことが、製作を始めたころの、最大のメリットでした。 しかし、 Win32 用にはバイナリパッケージがありますし、 UN*X 上でも、最近の namazu は、./configure; make で、 コンパイルは簡単です。

perl 版のメリットは、「perl しか使えないプロバイダでも使える」 ことくらいしかないでしょう。

改造しやすい (?)
perl で書かれているので、改造しやすい、かと思いきや、 最近は、自分でもワケワカメなスクリプトになりつつあります。
正規版にはない新規機能
を提案し、それを正規版に先駆けて塔載したことが、過去にはありましたが、 現在は、たいしたものはありません。
perl 版の数少ないメリットとして、
検索の組み合わせ
フレーズ + or 演算
{ 制御 ( システム | system ) }
フレーズ + 部分一致検索
{ *学部 *学科 }
フレーズ + 正規表現検索
{ /(バ|ヴァ)イオリン/ 協奏曲 }
部分一致検索 + わかち書き
*愛知大学* => { *愛知 大学* }
pnamazu-2000.05.08 からは、 後方/部分一致とわかち書きの組み合わせ検索をするためには、 同梱の bwnmz.pl で作った補助インデックスが必要となります。 これが無い場合、正規版同様、内部的に正規表現検索として扱います。
時間範囲検索
+[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 週間
grep 的機能
(元ファイルを読んで、検索結果の該当行を表示)
CGI 変数 'opmode'
'or' の場合
演算子の無いものを or として扱う
'inside' の場合
単純な日本語の単語検索の際に、語の前後に '*' がついているものとして扱う
'forward' の場合
単純な日本語の単語検索の際に、語の後に '*' がついているものとして扱う
利用法としては、例えば NMZ.head に
<select name="opmode">
<option selected value="normal">すべての語を含む
<option value="or">いずれかの語を含む
<option value="inside">単語の一部でも有効
<option value="forward">先頭部分の一致でも有効
</select>
というのをいれておくことが考えられます。
'-' 演算子
*京都* - 東京都
「京都を含む語のうち『東京都』以外」を含む文書にヒット
携帯電話モード
user agent が携帯電話のときは、
  1. 検索文字列を Shift_JIS として扱う (いわゆる半角カナも OK)
  2. 出力のサイズが小さくなるようにする
なんてことができることが挙げられます。
出力フォーマットファイル
による、検索結果出力のカスタマイズ

配付条件などは、基本的に正規版 namazu と同じとします。 無保証ですので at your own risk にて使って下さい。

pnamazu-2006.12.23.tar.bz2
マニュアル 履歴
NMZ.body.ja (pnamazu 版) NMZ.tips.ja (pnamazu 版)
附属のインデックス作成プログラム (tiny_mknmz.cgi) のマニュアル

# 2006.12.23
#    ! cross-site scripting 問題の修正
#    ! 簡易表示ができなくなっていた問題の修正
#    + NMZ.result に ${uri::decode} と書くと、% + 16進数のパターンを
#      デコードするようにした
#    * nmz-filter.pl というツールを同梱。インデックス内の単語を取捨
#      選択して、サイズを減らすことができます
#    ! tiny_mknmz.cgi が multipart のメールを処理する際に、boundary
#      の文字列によっては異常終了していたのを修正
#    ! 設定ファイルの読み込みに失敗するのを修正
#       (Thanks to MORIMOTO Hidenobu さん)
#    ! replace で \1, \2, ... が使えなくなっていたのを修正
#       (Thanks to 小川建一さん)
#    ! サーバによっては grep 機能が働かなかったのを修正
#       (Thanks to Yoshi Nagata さん)
#    * tiny_mknmz で、タイムスタンプが新しくなった場合だけでなく、
#      古くなった場合、サイズが変わった場合もインデックスを再作成
#    ! subject=title の読みかえが、ソートフィールドには使えなかった
#      のを修正 (Thanks to 青山 啓さん)
#    ! フィールドでソートする際、数字か文字列かの判定条件が緩かった
#      のを修正 (Thanks to 青山 啓さん)
#    ! grep する際、ファイル名の % + 16 進数をデコードするようにした
#       (Thanks to kou19 さん)
#    ! grep する際、ファイルを読み込むサイズと表示行数を制限できるようにした
#    ! tiny_mknmz.cgi が html のコメントを処理するようにした
#    + NKF.pm (2.0.4以上) があれば使うようにした。その場合は utf-8 も可

pnamazu に関して、過去にいただいた質問/今後いただきそうな質問と、 その回答をまとめておきます。

pnamazu では、多くの場合、 「Windows マシンでインデックスを作って、プロバイダで動かす」という、 形態で使用されているようです。 そのため、「インデックス環境 ≠ 検索環境」であることに起因する難しさ もあるように思います。

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

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

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

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

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

ローカルでは動いたんだけど、プロバイダでは動かない

次のことをもう一度ご確認ください。

  1. そもそも、そのプロバイダで CGI は使えるのか
  2. 動かすためのサーバの設定 (.htaccess とか) は正しいか (何らかの CGI が使えるところまでは、なんとか自力で到達してください)
  3. ftp でインデックスを転送する際、必ずバイナリモードにする
  4. ファイルのパーミッションの設定
  5. .namazurc でのディレクトリの設定

設定を書き換えた (または、改造した) ら、動かなくなった

一連のスクリプトは、EUC-JP で書かれています。 Windows では、Shift_JIS で書かれている前提で動作しているエディタなど もあり、そういうエディタで編集すると、スクリプトがどうなるか、 分かりません。とりあえず、

  1. ワードパッドで編集するのはやめましょう。
  2. 編集したら、"perl -c ファイル名" として文法エラーがでないことを確認しましょう。

部分一致 (前方/中間/後方/正規表現) 検索をしたときに、 どんな語に展開されたかが表示されるのがうっとうしい

パラメータに detail=off を加えてください。具体的には、例えば、 <input type="hidden" name="detail" value="off"> なんてのを入れてみてください。

replace がどうもうまくいかないんだけど…

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

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

Namazu は 1.3 系と 2.0 系とでインデックスに互換性が無いけれど、 pnamazu は、どちらに対応しているの?どちらが良いの?

レンタルサーバを使ってて、index や template が読み込めないようなんだけど…

レンタルサーバ (プロバイダでもそういうところがあるかも) では、通常、複数の顧客で共有する形態をとるため、ftp なり telnet でアクセスした際には、他人のディレクトリが見えないようにするため、 自分のホームディレクトリがルートディレクトリであるかのように見えるように 設定しているところがあります。例えば、コンテンツの転送の際には、 /public_html/index に置いたつもりで、.namazurc に

Index /public_html/index

と設定しても、真の位置は、/usr/home/hogehoge/public_html/index だったりするわけです。その場合、システムからは「/public_html/index なんてディレクトリは無いから読めん」ということになります。

というわけで、これらの設定には、真のディレクトリ位置を書くようにしてください。

.namazurc の template の扱いが本家と微妙に違うみたい

確かに違います。perl 版の動作は次のようになっています。

NMZ.{head,body,tips,foot} に関しては、インデックスを一つだけ指定した場合は、 そのインデックスのディレクトリのものが優先されますが、 複数指定した場合、一つも指定しなかった場合には template ディレクトリ のファイルが使われます。

NMZ.result.* に関しては、常に、インデックスと同じディレクトリのもの が使用されます。複数インデックスの検索をして、複数のインデックスから 文書がヒットした場合、文書毎にそれぞれが属するインデックスのテンプレ ートになります。

and 検索をしていて、ヒットしないひらがな語があるのに、件数が 0 にならないことがあるんだけど…

perl 版は初期の版から「ヒットしないひらがな語は演算対象としない」 という仕様があり、作者の好みにより、この動作がデフォルトになって います。この動作を変えるには、pconfig.pl の中の $HWMode という 変数を 'on' にして下さい。

opmode=inside を使ったら、かえって日本語がヒットしなくなってしまったんだけど…

あらかじめ、補助インデックスを作っておいてください。 インデックスのあるディレクトリで、同梱の bwnmz.pl を perl bwnmz.pl のように実行すると、 NMZ.m NMZ.mi NMZ.s NMZ.si という 4 つのファイルができます。


furukawa@tcp-ip.or.jp