[groonga-dev,02996] Re: in_values()の除外指定?

Back to archive index

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




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