インデックスファイルと転送

作成日:2007-03-04
最終更新日:

1. Namazu のインデックスファイル

Namazu は WEB の検索文章を加工してインデックスを作る mknmz というプログラムと、 インデックスを利用して語を検索する namazu というプログラムからなる。 mknmz の実行が終わると、mknmzを実行したディレクトリに NMZ.* ファイルが作られる。 Namazu では、これらのファイルをまとめてインデックスと呼ぶ。次はその一覧と簡単な説明である。

1.1 テンプレート

検索画面に使われるファイル。言語の拡張子がないのは英語を表す。言語の拡張子.??があるのは次の通り。

NMZ.head
検索結果表示のヘッダ(上部)を表す
NMZ.body
検索結果表示の中央部(使い方)を表す
NMZ.foot
検索結果表示のフッタ(下部)を表す
NMZ.result.normal
検索結果の通常表示
NMZ.result.short
検索結果の短縮表示
NMZ.tips
検索結果表示のコツを表す

なお、上記の NMZ.result.normal と NMZ.result.short 以外に NMZ.result.format を作成できる。

1.2 フィールド

Web ページの特徴を格納したファイル。これらとペアになる拡張子.iを持つファイルは seek 用インデックスである。 また、field. の後に続く特徴名を利用して、フィールドに含まれるキーワードを検索できる。例:
+subject:Linux
表題に Linux が含まれる文書を検索

NMZ.field.to
電子メールの文書を検索対象に含めたときの宛先。通常の HTML では空欄。
NMZ.field.date
文書更新時の年月日・時刻
NMZ.field.from
電子メールの文書を検索対象に含めたときの差出人。通常の HTML では、 差出人が明示されている場合に限り含まれる。
NMZ.field.message-id
電子メールやニューズグループの文書を検索対象に含めたときのメッセージ ID。通常の HTML では空欄。
NMZ.field.size
ファイルサイズ
NMZ.field.subject
文書の表題。HTML では、開始タグ <title> と終了タグ </title> の間にあるコンテンツが対象。
NMZ.field.summary
WEBページから抽出された要約文。詳しくは http://namazu.org/doc/tips.html#digest 参照。
NMZ.field.uri
web の URI

その他

以下は http://www.namazu.org/doc/nmz.html.ja を参考にした。

NMZ.i
単語検索用インデックスファイル(転置ファイル)
NMZ.ii
NMZ.i の seek 用インデックス
NMZ.log
mknmz による索引作成の更新ログ。
NMZ.p
フレーズ (phrase) 検索用のインデックス
NMZ.pi
NMZ.p の seek 用インデックス
NMZ.r
インデックスに登録されているファイルのリスト。テキストファイル。
NMZ.version
Namazu のインデックスバージョン。
NMZ.w
Namazu のインデックスワード。EUC。
NMZ.wi
NMZ.w の seek 用インデックス
NMZ.slog
namazu による検索されたキーワードのログ。1検索につき次の4フィールドがタブ区切りで記録される。
検索キーワード, 検索ページヒット数, IP アドレス, 検索時刻
NMZ.status
調査中
NMZ.t
文書のタイムスタンプ

2. 何を転送するか

私のホームページの Namazu 検索では、 かつて、自分のローカルのコンピュータで Namazu のインデックスファイルを作り、 それから必要な NMZ.* ファイルをリモートコンピュータへ転送していた。 以下はそのときの名残である。

では、どの NMZ.* ファイルを転送すべきだろうか。 インデックスファイルはすべて必要なのだから、転送すべきなのか。 それとも、必要なファイルを決めて、転送すべきか。

最初は必要なファイルを選ぼうとした。 しかし、ほとんど全てが必要であることに気づいた。 いらないものだけを省いて、あとは送ることにした。

$ruby -n -e 'print if $_.length > 70' NMZ.w

3. 実際のスクリプト

実際に転送ファイルを送るスクリプトを示す。言語は Ruby である。

#!/usr/bin/ruby
require 'net/ftp'

Dir.chdir('/homedirectory/localcomputerindexdirectory')
d = Dir.new(".")

ftp = Net::FTP.new(hostname, userid, password)
ftp.chdir('remotecomputerindexdirectory')
ftp.passive = true
d.each {|x|
	next if /^\.$/ =~ x
	next if /^\.\.$/ =~ x
	next if /^NMZ/ !~ x
	next if /log$/ =~ x
	next if /~$/ =~ x
	next if /BAK/ =~ x
	next if /tmp/ =~ x
	puts ("Got "+ x) 
	ftp.putbinaryfile(x, x, 1024)
}
ftp.close

ループの部分で next if の行が、 不適当なファイルを選別し、送らないようにしている箇所である。

まりんきょ学問所全文検索システム Namazu > インデックスファイルと転送


MARUYAMA Satosi