Kouhei Sutou
kou****@clear*****
2014年 12月 2日 (火) 15:38:10 JST
須藤です。 In <20141****@jcom*****> "[groonga-dev,02991] in_values()の除外指定?" on Sun, 30 Nov 2014 14:11:05 +0900, shinonon <shino****@jcom*****> wrote: > Groonga 4.0.8 のリリースおめでとうございます。 ありがとうございます! > Groonga 4.0.7 から追加されたという in_values() が 4.0.8 でさらに強化され > たということで、検索速度的に有利ということなので気になっています。 ほとんどのレコードがヒットするようなインデックス(= あまり効 果のないインデックス)を使うとき用の最適化が入っています。ほ とんどのメールがinboxに入っていて、それらにinboxというラベル をつけていて、inboxというラベルで検索するときに速くなる可能 性があります。 > 私は Bkroonga という Becky!(Windows用のメールクライアントソフト)で高速 > 全文検索を行えるようにするプラグインソフトを開発しています。 > そこで個々のメールをインデクシングするのに「ゴミ箱に置かれたメールか > (trash)」「添付ファイルか(attach)」というような情報をタグ付けしています > (ここを当初はビット演算子を使用した filter を使おうかと思っていたのです > が、逐次検索になるということや、須藤様からの助言もあり、現在はタグ付けす > るようにしています。4.0.8 で対応していただいたのに申し訳ありません)。 気にしないでください! > そこで、「添付ファイルを検索したいが、ゴミ箱のメールは除外したい」という > ときに、例えば in_values(attr, "attach", "!trash") というような指定がで > きるようにできませんでしょうか? うーん、文字列に「!」を入れてしまうと、演算子としての「!」な のか値としての「!」なのかを区別できなくなってしまうので、こ のやり方はできないですね。。。 not_in_values()というのを作って対応することはできる(ただし、 「含まれている」と「含まれていない」を混在はできない)んです が、"... || ... || ..."のパターンと違って、 "... &! ... &! ..."のパターンはこのままでも効率よく検索でき ます(できるはずです)。なので、まずは、 "in_values(...) &! ... &! ..."で速度を確認してみてください。 > 拙作の Bkroonga では今のところは、filter 条件に && や &! を次々とつなげ > ていくように作っています。その中で除外指定しか条件がないときは &! でつな > げることができないので、--filter '_id >= 0 &! attr @ "trash"' というよう > に、必ず成立する条件を追加したりしています。 なるほど! こういうときは --filter 'all_records() &! attr @ "trash"' というようにall_records()を使ってください! (あ、all_records()のドキュメントを書いていないや。。。) '_id >= 0'よりも負荷が小さいです。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ 名著『リーダブルコード』を解説者と一緒に読み解こう: http://schoo.jp/class/1502