[groonga-dev,03110] 静的インデックス構築時のGRN_TOKEN_SKIP_WITH_POSITION対応

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 3月 13日 (金) 15:41:18 JST


森さん

須藤です。

実装方法について相談です。

しばらく前にGRN_TOKEN_SKIPというのが導入されて、トークナイザー
側で位置情報をいじれるようになりました。

参考: http://sourceforge.jp/projects/groonga/lists/archive/dev/2014-August/002639.html

これを使うと、n番目のトークンがn番目の位置じゃなくなります。

現在の静的インデックス構築ではn番目のトークンがn番目の位置だ
という前提になっているため、GRN_TOKEN_SKIPを使うと正しい位置
情報のインデックスを構築できなくて検索時にヒットするべきレコー
ドがヒットしなくなってしまいます。

これを解決するためにはn番目のトークンがn番目の位置という前提
をやめて正しい位置情報を使う必要があります。(正しい位置情報
はgrn_token_cursorというやつが知っています。)

問題はgrn_ii_buffer.block_bufにこの位置情報を入れる隙間がな
いことです。grn_ii_buffer.block_bufはgrn_id *になっていて、
grn_idの空いている上位2ビットにセクション番号フラグと重みフ
ラグを入れて、grn_idの中にセクション番号か重みかトークンIDか
という情報を詰め込んでいます。

  https://github.com/groonga/groonga/pull/301

というように上から3ビット目を位置情報フラグにするとgrn_idに
位置情報も詰め込めるんですが、トークンIDが大きくなって3ビッ
ト目も使うようになると破綻します。

ということで、

  grn_id *block_buf;

を

  struct {
    byte type; ← enumの方がよいけど、サイズが重要なら1バイトにする
    union {
      grn_id tid;
      uint32_t sid;
      uint32_t weight;
      uint32_t pos;
    } value;
  } *block_buf;

というようにtypeを別に確保するようにしてもよいでしょうか?

たぶん、grn_idに詰め込んでいるのは空間効率をあげるためだと思
うのですが、隙間がないので増やしたいのです。。。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
Back to archive index