morit****@razil*****
morit****@razil*****
2005年 4月 8日 (金) 01:00:42 JST
> mysqlパッチにてmyisam/ft_update.cのft_sen_index_addの中で
>
> sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, buf);
>
> として、index登録を行なっています。
> posは数値型の変数となり、MYDのレコードのポジションになります。
> このポインタが最終的にsennaのsym.cファイルの_sen_sym_addに渡され
>
> if (!size) { size = strlen((char *)key) + 1; }
>
> にて、keyのバイト数を求めてからidの割り当てを行なっているのですが
> posは数値型なので、正確なkeyのバイト数が求められないケースが多々あります。
なるほど! 了解しました。
実はsen_index_create()関数の第2引数で文書IDのキー長を指定できるのです。
http://dev.razil.jp/project/senna/api.html より...
key_sizeにキー長(バイト長)を与えます。key_sizeに0が指定された場合は
可変長(nul終端する文字列)が指定されたとみなされます。
‥というわけで、
--- mysql-4.0.23.senna.diff.orig 2005-04-08 00:55:35.000000000 +0900
+++ mysql-4.0.23.senna.diff 2005-04-08 00:56:46.000000000 +0900
@@ -387,7 +387,7 @@
+ if (!share->keyinfo[i].senna) {
+ /* make index files */
+ sen_log("create index (%s)", buf);
-+ share->keyinfo[i].senna = sen_index_create(buf, 0, SEN_INDEX_NORMALIZE, 0, sen_enc_default);
++ share->keyinfo[i].senna = sen_index_create(buf, sizeof(int), SEN_INDEX_NORMALIZE, 0, sen_enc_default);
+ }
+ }
+
のように直せば解消すると思います。→ 反映します。
分かりにくい仕様ですみません‥
--
morita