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/