Naoya Murakami
visio****@gmail*****
2013年 8月 19日 (月) 23:22:57 JST
お世話になっております。村上です。 1.ベクターカラムについて ベクターカラムを少しだけ触ってみました。 参照先のテーブルの語彙は各レコードで共有される、参照元でDELETE、UPDATEしても、 参照先のテーブルの語彙は消えない、等、若干くせのある挙動をしますが、 mroongaでベクターカラムのドリルダウンができるようになってすばらしいです! データ保持用としては扱いが難しいかもしれませんが、検索用のテーブルとしては、 非常に有効に使えると思います!group by しなくてすみますし! 少し使っただけですが、以下の点が気になりました。 ・キーのリファレンス指定(?)を間違えると、mysqldがクラッシュします。 例: 参照先テーブル名:reference 参照元テーブルでのキー指定:KEY `ref` (`ref`) COMMENT 'table "referenc"' ・以下のようにインデックスにテーブルを指定すると、参照元のテーブルに 参照先のレコードをもとにしたキーが生成されるのでしょうか? キーサイズが大きくなり、キーサイズ合計の4G制限がさらにこわくなってくるなぁと感じました。 KEY `ref` (`ref`) COMMENT 'table "reference"' ・参照元テーブルのカラムのレコード長は、あらかじめ長めにとっておく必要があり、 また、キーの4Kbyte制限もかかってくるので、長い文字列やあまりの多数の レコードの格納には不向きだなと感じました。 ・TokenDelimitだけだと、英文等空白を含む文字列を扱えないため、ベクターカラムを使うに あたっては、セミコロン等、多少区切り文字のバリエーションがあると嬉しいと感じました。 TokenDelimitを1文字変えるだけで実装できたので、当方はTokenDelimitSemiColon というトークナイザを作ってベクターカラムを構成しました。 しかし、こうすると、selectは空白区切りで出力され、insert,updateはセミコロンという ちぐはぐになりました。。でも、便利なので、セミコロンで使おうと思ってます。 ・ベクターカラムのドリルダウン便利だなぁと思ったのですが、複数のテーブルを 横断してのドリルダウンは難しいですよね? できるのは、ドリルダウンソートしてアプリケーション側で足しこむぐらいかなぁと思っています。 2.order by limit の高速化について >別の方法として、AGAINST("..." IN BOOLEAN MODE)の中でgroonga >の検索条件を指定するという方法があります。 この方法を試したのですが、うまくAND条件で絞り込むことができませんでした。 varchar equalのorder by limitのoptimizationを追加していただいたことにより、 where match ... against and varchar = "hogehoge"の形では、 order by の最適化が動くようになりました!ありがとうございました! mroonga_commandを使えば他のケースでも複数インデックスが使えますが、 mroonga_commandは、SPIDER環境では使えないので、 AGAINST("..." IN BOOLEAN MODE)の中で検索条件を指定する方法が 使えれば、非常に嬉しいなぁと思っています。 以下は、order by limit最適化有無の速度差結果です。 (1)全文検索+VARCHAR一致 where match ... against and varchar = "hogehoge" order by int asc limit 1,10 0.312sec ○ 最適化が有効 (2)全文検索+VARCHAR前方一致 where match ... against and varchar like "hogehoge%" order by int asc limit 1,10 2.278sec × 最適化が無効 (3)mroonga_commandで全文検索+前方一致 select mroonga_command( 'select ftext_199x --match_columns title||abstract||claims||description --query "device varchar:hogehoge*" --output_columns app_id --limit 10'); 0.577sec ○ 複数インデックスが有効 (4)AGAINST("..." IN BOOLEAN MODE)の中で全文検索+前方一致検索条件を指定 select app_id from ftext_199x where match(title,abstract,claims,description) against ("device varchar:hogehoge*" in boolean mode) order by int limit 1,10; 0.889sec 後ろの条件で絞り込めない 以上、よろしくお願いします。