Namazu-win32-users-ja(旧)


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

Re: MaxHit とヒット件数について質問です



komaiです。

nasu shinya さんは書きました:
>ご指摘どおり、 [namazu-devel-ja] BER圧縮のデータの読み込みについてを
>見てみました。
>
>う〜ん。。。
>あまり理解ができてはいないのですが
>以下の部分で返されてしまうので、超えてしまうといわれてしまうのでしょうか?

多分、そういう感じではないでしょうか?(でも自分は自信なし。。)

MaxHitは、本来は、非常に多数のHITがある場合に効いてくる
というあいまいな認識しか(自分は)なかったので、
ほんとうの所は良く分かりません。

例えば、「は」というひらがながあって、それはたいていの場合、非常に
よくでてくる文字なので、あまり検索には、重要ではない。
でも、その「は」に対応する文書IDは、NMZ.iの中には含まれているが、
その処理を重要ではないからやめる?かどうか?は、どれくらいの文書の中にはいっているかを
しらべないといけない。そこで、Maxhitというパラメータを使っているんですよね。。

=ここまでは、NMZ.iの話=

あと一つ、謎を解く鍵が、NMZ.tというファイルです。
Namazuは、そのデータベース(という表現が正しいかどうかよくわかりませんが)
の中で、文書IDが、更新されたか(あるいは)削除されたファイルについては、
そのタイムスタンプの代わりに-1という値をNMZ.tというファイルに書き込みます。

=ここから想像です。まちがっているかもしれません=

つまり、文書が1つしか無い場合でも、更新をした場合、或いは削除した場合は、
その対応する文書に関しては、以下のようになると思います。
(1回ファイルを更新して、1回削除して、また元のファイルをもとに戻した場合)

NMZ.i ファイル:の中身の概要
例:「は」という単語:文書ID1 スコア値、文書ID1 スコア値、文書ID1 スコア値(実際は2個目以降は差
分)
と記述されているのかもしれません。

実際には、更新されたり、削除されたりしたした場合、それに対応する文書IDは
示す必要がないので、最後のほうの処理で、表示すべきファイルから消すような
処理を行っているのではないかな?と想像しています。

というわけで、途中で更新したり、削除して、mknmzしてもういちど前のファイル
を復活させた場合には、少し話しがややこしくなるような気もします。

これを確かめるには、NMZ.iの、とある着目する単語について、
文書ID、と スコア値のペアが何個含まれているかをチェックするといいでしょう。
(具体的には、NMZ.*ファイルの仕様から、ファイルの中身を読み解く。)
或いは、NMZ.t のファイルは4byteのBig Endianで書かれているファイルなので、
その中身を見てみるというのも手かもしれません。
(まずは何Byteなのかを確認する。1つしか対象にしない場合は4だと思うのですが。
更新、削除したりすると、ファイル名が同じでも、このファイルサイズは増えると
思うのですけど。。) 
そして、このファイルサイズが増えてくると、厳密なMaxhit数との比較が難しく
なるような気がします。
(つまり、NMZ.iのとある該当する単語の中の、格納されている文書IDの数から、
本当に存在しているかどうかのチェックもNMZ.tの値を見ながら、その分をさっ
引かないといけないので。そこまでnamazu.exeがやっているかどうかは
よくわかりません。develの方でMaxhitに係る修正が入っているという話題も
見たことがあるような気がしたのですが。。)

=想像ここまで=

というわけで、ソースを全て追っていけばよいのですが、自分には、そこまで
できていないので、この話題は、丁度、いろいろな理解を深める意味でも、
devel の方で質問をしてみるというのが、専門家が多いので一番近道と思います。
(すみません、無責任な振り方で。。)


>NmzResult 
>nmz_get_hlist(int index)
>{
>        ・・・
>        n = 0;
>        totalsize = 0;
>        while (totalsize < bersize) {
>            totalsize += nmz_get_unpackw(Nmz.i, &buf[n]);
>            n++;
>            if (n > maxhit * 2) {
>                hlist.stat = ERR_TOO_MUCH_HIT;
>                free(buf);
>                return hlist;
>            }
>        }