Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

redesigning mknmz



気が向いたので mknmz --help をもとに mknmzの再設計を検討しま
した。言語は perl を想定していますが、設計そのものは他の言語
にも通用すると思います。

| 対象ファイル:
|   -a, --all                すべてのファイルを対象とする
|   -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=INT          変更日制限 find(1) の-mtime と同じ規則
|                            例:-50 で50 日以内、+50 で50 日より古いものだけ

対象ファイルを見つける部品は File::Find を所有するクラス 
Namazu::Find に分解するといいと思います。


| 形態素解析:
|   -c, --use-chasen        日本語の単語のわかち書きにChaSen を用いる
|   -k, --use-kakasi        日本語の単語のわかち書きにKAKASI を用いる
|   -m, --use-chasen-noun   名詞のみを抽出する

わかち書き処理のモジュール化は野首さんに期待。 :-)
Text::Splitter があると便利そう。


| 文字列処理:
|   -E, --no-edge-symbol  単語の両端の記号は削除する
|   -G, --no-okurigana    送り仮名を削除する
|   -H, --no-hiragana     平仮名のみの単語は登録しない
|   -K, --no-symbol       記号をすべて削除する

文字列の処理は Namazu::Lex クラスにまとめるといいかな。フィ
ルタ類は Namazu::Filter に。


| 要約:
|   -U, --no-encode-uri       URIのencodeを行わない
|   -x, --no-heading-summary  HTML のヘディングによる要約作成を行わない

要約は Namazu::Summary (has a HTML::Summary) かな。


| インデックス作成:
|       --update=INDEX        更新するインデックスを指定する
|   -Y, --no-delete           削除された文書の検出を行わない
|   -Z, --no-update           文書の更新・削除を反映しない

インデックス作成のためには、まずインデックスを表現する 
Namazu::Index クラスが必要です。また、文書を表現するクラスと
して Namazu::Document が欲しいです。

Namazu::Document は Namazu::Lex と Namazu::Filter を使って自
分自身の面倒をみます。

その上で、 Namazu::Index と Namazu::Document を使ってインデッ
クス作成をしてくれるクラス Namazu::Indexer があるといいと思
います。

複数のインデックスをマージする仕事は Namazu::IndexMerger ク
ラスに任せます。

現在は、$ON_MEMORY_MAX の単位で作業ファイルを作りながら 1つ
のインデックスを大きくしていますが、新しい設計では、
$ON_MEMORY_MAX の単位で小さなインデックスを作成して、最後に
Namazu::IndexMerger にマージしてもらう、という方針がいいでしょ
う。


| その他:
|   -s, --checkpoint        チェックポイント機構を作動させる

mknmz を Namazu::Mknmz クラスとして表現します。re-exec 時に
は Data::Dumper を使って内部状態をファイルに書き出せばいいと
思います。--checkpoint オプションを廃止して、常に re-exec す
る仕様にした方がいいかもしれません。


|   -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              このヘルプを表示する

こういったユーザインターフェイスに関する細かい処理は 
Namazu::Mknmz に任せます。他のクラスは自分の単純な仕事に専念
します。

Namazu::Mknmz は複数の Namazu::Indexer に仕事を割り振って、
それらを並列に働かせる能力を持っているといいと思います。並列
処理の実装は perl のスレッド機能か、単純なfork & exec のどち
らかを選びます。--checkpoint を考えると後者の方が楽そうです。

C で mknmz を完全に書き直すのは大変なので、高速な処理が必要
なクラス (たとえば Namazu::Index, Namazu::Lex) だけを Cのラ
イブラリとして書く、という方針がいいかもしれません。

…以上、おおまかですが、たたき台として再設計の案をまとめまし
た。オブジェクト指向の設計に不馴れなので、こなれていない部分
があると思います。ご意見ください。

# こういった話を 4月18 日にできるといいですね

p.s.  
だんだん perl が嫌になってきました。オブジェクト指向の設計で
書き直すなら別の言語を選択した方がいいかもしれません。

-- Satoru Takabayashi