On 07/21/04(13:10) you ysato@delegate (Yutaka Sato) wrote in <_A2@freyasx.ML_> |今後「link:」の他にも拡張したくなったときのために、予備のフィールド |を作っておくべきか?それとも使わないフィールドのためにファイルが |大きくなるのはいかがなものか?使ってるフィールドだけ保存するように |できるか?もしそうなら、プログラムを書き換えずに自由に拡張できるような |仕組みを入れておきたい。 どうもそんな感じではないかと思っていたのですが、Freyaには「テキストの 出現位置からドキュメントの番号やテキストの種別へマッピングを行う」XMap というものがあります(.map)。これは、各ドキュメントに対応する固定長 レコードを、2分検索する形で実現されています。 各固定長レコードは、全テキスト中での文書の位置と、テキストの種別(タイ トル中とか本文中とかの文脈属性)ごとに、そのサイズが記録されているという ものです。つまりこのままでは可変長に拡張可能にするのは難しい。 2分検索で行くとすると、可変長レコードへの配列へのオフセットの配列という のを一段噛ませるしかないと思われます。 これはたとえば内容が10万件あっても、たかだか400Kバイトです。 一方各可変長レコードは {種別番号, 開始位置} の組にすれば良さそうです。 いや、どうせやるなら、いっそXMapを省略できないか。そうすれば検索も多少 高速になりそうだし。そのためには、 テキストの出現位置情報を、{ドキュメント番号, 種別, オフセット} にすれば 良さそう。これを、従来と同じ 32ビットで表現すると、それぞれ {20, 5, 7} ビットという感じ。 100万件の文書。32種類の属性。128段階の出現位置。出現位置は適合度のスコア のためだけに使われていると思うので、例えば256バイト単位くらいで十分だと 思う。また、32Kバイト以降の場合「それ以降」で十分なのではないかと。ある いは出現位置の対数でも良いかも。 (このオフセット値は結局、文書内の行番号にすることにしました。また差分 による圧縮の効率を多少良くするように?位置情報は、 テキストポインタ = {ドキュメント番号:20, 行位置:7, 種別:5} とすることにしました) 100万件を越えたらどうするか?というと、まあそういう使い方はまずしないと 思うけど、その場合には索引を分割して、検索時に併合すれば良いのでは。 そのほうが性能的にも有利のような気がするし、分散並列検索とう拡張も考え られるし。 ... そんなわけで、XMap は、最小限の機能 (各ドキュメントの先頭位置だけを記憶 する。現状では各ドキュメントのサイズを求めるのに用いる) ということに しました。この値も、scoreによるソートのための重み付けの基礎情報として ちょっと使われているだけなので、XMap はほぼ省略可能になりました。 一方、ソートのために DescFile (.dsc) 中の値を使う場合の高速化を考えると、 XMap は残しておいて、ソート用の値だけを保持するようにするとか、、、 それとも .dsc に完全に吸収してすっきりするか。うーむ。 D G ┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller} ├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/> ┴ └┴──┘┴────────────────────────────── 佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)