namazu-ml(avocado)


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

Re: Distributed Namazu



Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx> wrote:

>>    もちろん、リモートに全部返してもらえばいいのですが、場合によっては
>>    他人様(よそさま) のサーバを酷使することになるので、それもちょっと…
>
>これなんですよね。 Namazuの場合、複数のインデックスの検索結果をマー
>ジする処理は文書のIDとスコアからなるデータ (そのうち日付の情報も含
>めます) を元に行っていて、後から結果表示の際に文書のIDを元に要約を
>取り出して出力するようになっています。そういう仕組みなのでリモート
>の結果をマージするのには向いていません。
>
>リモートとのやり取りを 2回に分けて、1回目に検索結果の IDとスコアの
>データ (そんなに大きくない) をもらって、それを元に全体をマージした
>後、結果表示に必要な要約をもらうようにすることも考えられますが、や
>り取りが複雑になるので難しいところです。

これ、やってみました。検索時に

  % namazu keyword 'http://foo.bar.jp/namazu.cgi?dbname=hoge'

と別のホストの CGI をURL式に指定することで実現します。また、

  % namazu keyword 'http://foo.bar.jp/namazu.cgi?dbname=hoge' \
                   'http://foo.bar.jp/namazu.cgi?dbname=boee' \
                   ~/NMZ/myindex

のようにローカルのインデックスを含めて複数指定しても動くはずです。
リモートホストとの通信は単に HTTP で CGI の出力をもらっているだけ
です (通信は 2回に分けて行われます)。検索結果はローカルのインデッ
クスを対象に検索したときと同じように出力されます。

当然のことですが、相手のホストの CGI、ローカルホストの検索プログラ
ムはともにこの新しい仕組み (名称未定) に対応している必要があります。
とりあえずいまのところ namazu v1.3.0.0-distributed という名前がつ
いています (分散システムというほど大げさなものでもありませんが)。

  http://saturn.aichi-u.ac.jp/~ccsatoru/namazu.cgi?dbname=RFC
  http://saturn.aichi-u.ac.jp/~ccsatoru/namazu.cgi?dbname=JF

あたりは対応しているので実験に使っていただいても結構です。

http を喋る部分は Cで書くのが面倒だったので Perl で書いた別のプロ
グラムになっています。 HTTP/1.1 に準拠 (本当に?) しているので同じ
ホストへの連続した通信はコネクションを切らずに続行します。 

…と、こんなところですが、需要があるようなら真面目に取り組みます。
v1.3.0.0 へのパッチをメイルの末尾に添付しておきますので、興味のあ
る方はお試しください。ご意見をお待ちしております。何か面白い応用の
アイディアがあるとよいのですが。

なお、パッチは namazu-1.3.0.0 のディレクトリ (README のあることろ) で

% patch -p1 <patch

と実行して適用します。

注意

  * テストは不十分です。深刻なバグは必ずあります
  * http の通信に外部プログラム /usr/local/namazu/bin/httpagent を
    呼び出しています。パス名は agent.c に決め打ちされています。

余談

  * とにかく動くことを目指してコーディングしたのでただでさえ汚いコー
    ドがより一層ひどくなってしまった (namazu)
  * Perl で書いた httpagent の方はプログラミングしていてなかなか楽
    しかった
  * やっぱり C は嫌い (日に日にアレルギーが強まっていく…)

-- Satoru Takabayashi
妙に注釈の多い文章になってしまった

begin 644 patch.gz
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
G%*)3D:L>SSY$"XS5;'14BV#1'Q"=#"+RMGMRS!_Y+XZ']IONB```
`
end