[groonga-dev,01649] Re: mroongaストレージモードの複数インデックスを使用した検索について

Back to archive index

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
後ろの条件で絞り込めない

以上、よろしくお願いします。



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