groonga / grnxx

groonga++
Other
7 stars 0 forks source link

Signature 方式について検討する #128

Open s-yata opened 9 years ago

s-yata commented 9 years ago

概要

Signature 方式の全文検索について検討します. 基本的な構成を検討するとともに,どのような機能が提供できるのかも検討します.

基本的な構成は,トークンをビットに割り当てた Signature を使って対象を絞り込むというものです. 転置索引より単純であり,途中まで絞り込んだ状態からも使えるのが利点になると思います.

daijiro commented 9 years ago

などすぐれた特徴があります。

s-yata commented 9 years ago

トークナイズについて

文字列からトークンを取り出す方法については,転置索引と同じような課題があります.

以上は日本語をイメージした課題ですが,英語などの言語では Stemming が課題となります. 基本的に,走査の段階では重い処理を入れたくないというのが本音です.

s-yata commented 9 years ago

走査について

単純な文字列照合(たとえば Boyer-Moore (BM) 法)を使うか,あるいはオートマトンを使うかの選択肢があると思います. オートマトンを使えば,より複雑なクエリを記述できますが,代わりに処理が重くなります. 単純な例としては,英字の大文字・小文字を同じように扱うことなどが挙げられます.

どのような機能をサポートするかが重要になりそうです.

s-yata commented 9 years ago

Signature の長さについて

固定長にすれば処理を単純化できます. その代わり,短い文字列に合わせれば長い文字列の扱いに問題があり,逆もまた然りです.

可変長にすると,文字列の長さや 1 の割合に合わせて調節できます. その代わり,操作は複雑になり,オーバーヘッドが大きくなります.

s-yata commented 9 years ago

Signature の配置について

文字列の本体に近接させれば, Signature で拾ったときにキャッシュミスを減らせそうです. 一方で, Signature で拾う割合が少なければ,キャッシュミスを増やしてしまうだけかもしれません.

データ構造の自由度を考慮に入れると,文字列と Signature は別々に配置した方が良さそうです.

s-yata commented 9 years ago

Signature の分割について

長い文字列に対する Signature を分割する案については,クエリを構成する文字列が離れて現れるのを許容するかどうかが鍵になります.

たとえば, A and B というクエリを与えられたとき, AB が近くに現れたときだけを拾うのであれば, Signature を分割するのは良い案かもしれません. しかし,遠くに現れたときも拾いたいのであれば,分割した Signature をわざわざ重ねて照合することになり,分割が裏目に出ます.

s-yata commented 9 years ago

機能について

s-yata commented 9 years ago

トークナイズおよび不要語の問題がうまく解決できそうにないため, Signature 方式は保留とします.