Kouhei Sutou
kou****@clear*****
2014年 11月 3日 (月) 19:07:37 JST
須藤です。 報告ありがとうございます。 再現クエリーもつけてくれていたので確認作業が楽になりました。 助かりました。 In <20141****@jcom*****> "[groonga-dev,02903] Re: ビット演算子を使用したfiler" on Sun, 02 Nov 2014 13:30:09 +0900, shinonon <shino****@jcom*****> wrote: > 少し追試してみました。 > 昨日と同条件で、query を使わなければ期待した動作をしました。 > > select --table Files --filter '(flg&1)==0' > > だと検索ができ、 > > select --table Files --filter '(flg&1)==1' > > だと検索できませんでした。 > ビット演算子を filter に用いて query を同時に使う際に、何かしら制限があ > るのでしょうか? 調べたところ、このケースには次の2つ問題があることがわかりま した。 1. 1回でも算術演算子(足し算とかビット演算子とか)を使うと インデックスを使って検索できない (= 全件を走査する逐次検索になる) 2. 逐次検索のとき、--match_columnsと--queryの組み合わせを 使っているとどのレコードにもマッチしない masterではどちらも直したので次のリリースからは * 全文検索(--match_columnsと--queryの組み合わせの条件)は インデックスを使って検索 * 「(flg&1)==0」は逐次検索 というようにインデックスを使った検索と逐次検索を組み合わせて 動くようになります。 また、--match_columnsと--queryの組み合わせで指定した全文検索 が逐次検索になってしまったときでも、--match_columnsに1つのカ ラムだけを指定した場合は動くようにもしました。 つまり、今回の次のような使い方のときは動きます。 select --table Files --match_columns body --query groonga ただし、 select --table Files --match_columns Bigram.file_index --query groonga というようにインデックスを指定したときや select --table Files --match_columns title||body --query groonga と複数のカラムを指定したときは動きません。 まぁ、逐次検索になった時点で負けなので、普段は逐次検索での全 文検索のことは気にしなくてよいです。 ところで、フラグを使った検索ですが、もしかしたらタグ検索にし た方が速くなるかもしれません。 こんな感じです。 selectの--filterで使っているin_values()というのがポイントで、 通常は「tags @ "readable" OR tags @ "secret"」というようにOR をたくさんつなげないといけないケースのときに使います。 ORをたくさんつなげると重くなるんですが、in_values()はそうい うケースでもなるべく重くならないように工夫しています。 もしよかったら、in_values()は4.0.7から追加されているので試し てみてください。 (ドキュメントはまだ書いていないんですが。。。) -- table_create \ --name Tags \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --normalizer NormalizerAuto table_create \ --name Files \ --flags TABLE_HASH_KEY \ --key_type ShortText column_create \ --table Files \ --name tags \ --flags COLUMN_VECTOR \ --type Tags column_create \ --table Files \ --name body \ --flags COLUMN_SCALAR \ --type LongText column_create \ --table Tags \ --name files_index \ --flags COLUMN_INDEX \ --type Files \ --source tags table_create \ --name Bigram \ --flags TABLE_PAT_KEY \ --key_type ShortText \ --default_tokenizer TokenBigram \ --normalizer NormalizerAuto column_create \ --table Bigram \ --name file_index \ --flags COLUMN_INDEX|WITH_POSITION \ --type Files \ --source body load --table Files [ {"_key":"1","body":"groonga","tags":["readable","writable","secret"]} ] select \ --table Files \ --match_columns body \ --query groonga \ --filter 'in_values(tags, "readable", "secret")' -- -- 須藤 功平 <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/