2007年02月28日

遂にSennaの1.0.0が出ましたよ!
プレスリリースによると

●メジャーバージョン(1.0.0)リリースについて

Senna1.0.0では転置インデックスの格納形式を改善し、更新/検索速度を損ねる
ことなくサイズを最大で従来比70%程度まで圧縮することに成功しました。この
ため、従来よりも大規模な文書を1台のサーバで管理することが可能となりました。

という事なので早速wktkしながらinstallしました。

色々考えるのがめんどくさかったので、動いてる環境にsennaとmysqlを順番にmake installしてmysql restartです。

早速indexを作り直してみると。。。。

-rw-rw----  1 mysql mysql 1.0K  21:05 SEARCH_DATA.MYI
-rw-rw---- 1 mysql mysql 263M 21:05 SEARCH_DATA.000.SEN.i.c
-rw-rw---- 1 mysql mysql 31M 21:05 SEARCH_DATA.000.SEN.i
-rw-rw---- 1 mysql mysql 45M 21:03 SEARCH_DATA.000.SEN.l
-rw-rw---- 1 mysql mysql 8.1M 20:56 SEARCH_DATA.000.SEN
-rw-rw---- 1 mysql mysql 426M 20:56 SEARCH_DATA.MYD
-rw-rw---- 1 mysql mysql 8.5K 20:56 SEARCH_DATA.frm
-rw-rw---- 1 mysql mysql 1.0K 17:01 SEARCH_DATA_senna_r327.MYI
-rw-rw---- 1 mysql mysql 325M 17:01 SEARCH_DATA_senna_r327.000.SEN.i.c
-rw-rw---- 1 mysql mysql 31M 17:01 SEARCH_DATA_senna_r327.000.SEN.i
-rw-rw---- 1 mysql mysql 85M 16:59 SEARCH_DATA_senna_r327.000.SEN.l
-rw-rw---- 1 mysql mysql 8.1M 16:51 SEARCH_DATA_senna_r327.000.SEN
-rw-rw---- 1 mysql mysql 426M 16:51 SEARCH_DATA_senna_r327.MYD
-rw-rw---- 1 mysql mysql 8.5K 16:51 SEARCH_DATA_senna_r327.frm
_senna_r327って付いてるのが過去の物(0.8.0で作ったindex)で、上の方が1.0.0で作ったindexです。
本当にサイズ圧縮されてる!
今のところ漏れとか不具合っぽいのがないのでいい感じです。
どのようにしてサイズ削減を行ったかにもよりますが、サイズが小さいと細かい所でパフォーマンスも上がりそうな予感です。

そしてsennaのソースを久しぶりに見てみたら気になる所がいくつか。
mysql-4.0.27.senna.diffのsql/sql_yacc.yyを弄ってる箇所に

+       | ULONG_NUM { $1 < 65536 ? $$=((ulonglong)$1) << 32 : $$=$1; };
という処理が。
これはきっとUSING NGRAMとかの拡張クエリの部分を実装してる所だと思うんですが、ここに数値を直接指定できるようになってるっぽいんですよね。USING 97342482みたいに。
で、このUSINGのパラメータはMI_INFOのsenna_flagに入るっぽく、同patchのft_sen_index_addが実装されてる所辺りに
+#define SECTIONALIZE 0x00080000
ってあって
+  if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) {
+ FT_SEG_ITERATOR ftsi;
+ uint len = 0;
+ unsigned int section;
+ sen_values *values;
+ _mi_ft_segiterator_init(info, keynr, record, &ftsi);
+ while (_mi_ft_segiterator(&ftsi)) {
+ if (ftsi.pos) {
+ if (ftsi.len > 1048576) { sen_log("ft_sen_index_add: ftsi.len=%d", ftsi.len); }
+ if (ftsi.len > len) { len = ftsi.len; }
+ }
+ }
+ if (!len) { return -1; }
+ _mi_ft_segiterator_init(info, keynr, record, &ftsi);
+ section = 1;
+ while (_mi_ft_segiterator(&ftsi)) {
+ if (ftsi.pos) {
+ values = sen_values_open();
+ sen_values_add(values, ftsi.pos, ftsi.len, 0);
+ sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, NULL, values);
+ sen_values_close(values);
+ }
+ section++;
+ }
+ return 0;
+ } else {
みたいな処理が。

sen_values_*ってのは段落云々のAPIだから、mysqlバインディングのドキュメントに無い実装があるっぽいかもしれません。
多分複数のフィールドを一つの塊として扱えるんじゃないのかなぁ。良くわからないけど。


開発ロードマップを見るとストレージ機能の実装が有るそうなので、こちらもwktkです。

Posted by Yappo at 2007年02月28日 05:49 | TrackBack | 検索システム構築
Comments

するどい。。

Posted by: at 2007年03月02日 01:24
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。