Namazu-users-ja(旧)


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

Re: フレーズ検索のHASH値への変換方法



寺西です。

"Komai @home" wrote:
> 
> 自分でPerl読みきれていないところ、お騒がせしてすみません。。

いえ。実際 ファイル仕様と実装に違いがありますからね。
悩みますよね。
 
> Tadamasa Teranishi さんは書きました:
> >ところが、pl/nmzidx.pl では BER圧縮されたデータのバイト数 として
> >扱っていました。
> >
> >こうなってくると、BER圧縮されたデータのバイト数 に仕様を変更する
> >方が楽かもしれません。
> >きちんと提示されているファイル仕様を今更変えるというのには気が
> >進みませんが、その方が修正箇所はわずかなようです。
> たしかに、、自分も最初、Cで簡単なクライアントプログラムを
> 作ったり、nmzrを作っていて、随分と悩みました。
> 誤記修正ということで良いような、、、

その可能性も高いかもしれません。
 
おそらく readw() が最初に登場したであろうころから、どうやら
BER圧縮されたデータのバイト数 として扱われていました。

http://www.namazu.org/ml/namazu-dev/msg00327.html

NMZ.i のファイル仕様が変更になったのは、このころです。

http://www.namazu.org/ml/namazu-dev/msg00298.html

いろいろと調べていると namazu で 文書の総数 * 2 として扱っている
のは、nmz_get_maxhit() * 2 との比較している部分だけでした。
(これは、検索で見つかった文書の数の上限チェックです。)
それ以外の部分、NMZ.p を扱っているところなども含めて
BER圧縮されたデータのバイト数 として扱っていました。

文書の数の上限チェックを BER圧縮されたデータのバイト数 を使う場合
に正確に計算するには、一度ファイルから読み出して文書の数を数える
必要があります。nmz_read_unpackw() を使えばできますが、
異常に文書数が多い場合は、大量のバッファを確保後、無駄にデータ
を読み込んだ上で判断しなければならなくなります。
修正するなら、この部分を少し工夫するといいでしょう。

なお、
> nmz_read_unpackw() の第3引数には、文書の総数 * 2 を渡しているにも
> 関わらず、これをバイト数だと解釈して、変換後の個数を戻値に
> 返します。
...
> nmz_read_unpackw() の仕様はかなり不自然な気がします。
> やはり nmz_read_unpackw() にバグがあるだけで、第3引数には、
>文書の総数 * 2 を渡すという仕様と考える方が自然です。

とバグと書きましたが、これはどうやら
 文書の総数 * 2 < BER圧縮されたデータのバイト数
の関係が成り立つことから、大は小をかねるといったどんぶり勘定で、
大きめのバッファを使っているだけと解釈するのが自然でした。

> もしmknmz側というか、提示されているファイル仕様どうりで、他のソース変更と
> なれば、Namazuのバージョン番号も
> 2.1.0とか上げた方が良いような気もしますし。。
> (それも面倒?)うーむ。。

ファイル仕様の誤植と考えて、修正するだけで実質問題ないかもしれません。

私は 文書の総数 * 2 として実装していましたが、
 文書の総数 * 2 == BER圧縮されたデータのバイト数
が成り立つ程度の小規模な文書数でしか使っていませんでした。

実績のある namazu クライアントでは、BER圧縮されたデータのバイト数
として取り扱っているものと思われます。
(ただし、namazu 同様、文書の数の上限チェック の部分は、ファイル
仕様の 文書の総数 * 2 を使うといった混在の可能性はありますが。)

なお、NMZ.p に関しては
http://www.namazu.org/doc/nmz.html.ja#p
文書数か、BERバイト数のどっちにしても
    [ハッシュ値\x0000を含む文書数][ハッシュ値\x0000を含む文書ID]...
    [ハッシュ値\x0000を含む文書数][ハッシュ値\x0001を含む文書ID]...
    [ハッシュ値\x0000を含む文書数][ハッシュ値\xffffを含む文書ID]...
は
    [ハッシュ値\x0000を含む文書数][ハッシュ値\x0000を含む文書ID]...
    [ハッシュ値\x0001を含む文書数][ハッシュ値\x0001を含む文書ID]...
    [ハッシュ値\xffffを含む文書数][ハッシュ値\xffffを含む文書ID]...
と思われるので、誤植を含んでいるのは確かです。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E