BloGroonga

2014-11-29

Groonga 4.0.8リリース

今日はいい肉の日ですね!Groonga 4.0.8 をリリースしました!

それぞれの環境毎のインストール方法: インストール

変更内容

今回はいくつか実験的な機能が追加されています。興味のある方はぜひ試してみてフィードバックをおねがいします。

  • [実験的] 逐次検索への自動切り替えのサポート (in_values/between)
  • [実験的] 複数のキーによるドリルダウンのサポート
  • [実験的] range_filterコマンドのサポート
  • groonga-httpdがデフォルトのHTTPサーバーになりました
  • [告知] Groonga Advent Calendar 2014はじまるよ!

[実験的] 逐次検索への自動切り替えのサポート(in_values/between)

今回のリリースでは、逐次検索への自動切り替えのサポート(in_values/between)を追加しました。

逐次検索への自動自動切り替えがどういうことか簡単に説明します。

例えば、–filterで絞り込んでからさらに&& in_values()で絞り込むとします。 通常、インデックスが使えるならインデックスを使って効率良く検索し、使えない場合には 逐次検索をしてマッチしたもので絞り込んでいきます。

インデックスが使える場合には、&& in_values()で絞り込み対象となるレコード数が だいたいどれくらいかが事前にわかっているので、追加で絞り込む前と インデックスを使って検索する対象となるレコードの比率を求めます。

(A) –filterで1000件に絞り込んだ && in_value()の対象となるレコード数が5万件

1000/50000 = 0.02

(B) –filterで1000件に絞り込んだ && in_value()の対象となるレコード数が50万件

1000/500000 = 0.002

(A)の場合は20%とそこそこ比率が高めです。一方(B)の場合は2%と大分小さいです。

そこで、(B)のときにインデックスを使わずに逐次検索してマッチしたものを返すのと (B)のときに50万件が対象となるインデックスを使って検索するのとどちらがコストが高いか という話になります。適切な閾値を下回る(対象となるデータ件数が十分少ない)のであれば 逐次検索したほうが速そうですね、というところがポイントです。

この機能はデフォルトで有効になっていて、閾値が0.01になっています。そのため上記の(A)の場合には適用しませんが、(B)のときには逐次検索を試みます。

なおデフォルトの閾値は暫定的なもので、将来変更される可能性があります。また、必ずしもすべてのケースで確実に高速化が見込めることを保証できているわけではありません。

そのため、この挙動は環境変数で変更することができるようになっています。

in_values()の場合:

# 逐次検索をしない
GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO=-1
# 比率の閾値を0.02にする
GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO=0.02

between()の場合:

# 逐次検索をしない
GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO=-1
# 比率の閾値を0.02にする
GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO=0.02

試してみて閾値はこれくらいに設定するのがウチの場合はよかった、などフィードバックをもらえると嬉しいです。

詳細はbetweenin_values(まだドキュメント化が追いついていない)のドキュメントを参照してください。

[実験的] 複数のキーによるドリルダウンのサポート

今回のリリースでは、複数のキーによるドリルダウンのサポートを追加しました。

これにより、大項目、中項目、小項目といった項目でグループ化した結果を簡単に取得することができるようになりました。これまでは1つのキーしかサポートしていなかったので、そういったことをやるにはアプリケーション側で頑張らないといけませんでした。

実際にどんな感じに使えるのか説明します。

サンプルとして使うスキーマは次のとおりです。

table_create Tags TABLE_PAT_KEY ShortText
table_create Memos TABLE_HASH_KEY ShortText
column_create Memos tag COLUMN_SCALAR Tags
column_create Memos date COLUMN_SCALAR Time

これに次のようなデータを投入します。

load --table Memos
[
{"_key": "Groonga is fast!", "tag": "Groonga", "date": "2014-11-16 00:00:00"},
{"_key": "Mroonga is fast!", "tag": "Mroonga", "date": "2014-11-16 00:00:00"},
{"_key": "Groonga sticker!", "tag": "Groonga", "date": "2014-11-16 00:00:00"},
{"_key": "Rroonga is fast!", "tag": "Rroonga", "date": "2014-11-17 00:00:00"},
{"_key": "Groonga is good!", "tag": "Groonga", "date": "2014-11-17 00:00:00"}
]

データの準備ができたら実際にドリルダウンしてみましょう。クエリはこんなふうに書きます。

select Memos \
  --command_version 2 \
  --drilldown[tag].keys tag,date \
  --drilldown[tag].output_columns _key[0],_key[1],_nsubrecs

ドリルダウンの構文がこれまでと違いますね。

キーの指定は --drilldown[LABEL].keys になりました。また、出力対象の指定も --drilldown[LABEL].output_columns になっています。

--drilldown[tag].output_columns _key[0],_key[1],_nsubrecs

output_columnsはちょっと見慣れない _key[N] がありますね。これは、keysに指定したどちらのキーの値をとってくるかを指示するものです。

そのため、上記クエリの場合は _key[0]tag カラムのレコード値をとってくる、 _key[1]date カラムのレコードの値をとってくるという意味になります。_nsubrecs はグループ化した件数です。

返ってきた結果を抜きだすとこんな感じになります。

{
   "tag": [
     [
       4
     ],
     [
       [
         "_key[0]",
         null
       ],
       [
         "_key[1]",
         null
       ],
       [
         "_nsubrecs",
         "Int32"
       ]
     ],
     [
       "Groonga",
       1416063600.0,
       2
     ],
     [
       "Mroonga",
       1416063600.0,
       1
     ],
     [
       "Rroonga",
       1416150000.0,
       1
     ],
     [
       "Groonga",
       1416150000.0,
       1
     ]
   ]
 }

ドリルダウンによってtagがGroongaであるもののうち、時刻が重複しているものが2つあることがわかります。

大事なポイントがもう一つあります。クエリに–command_version 2を付けるのを忘れないでください。これは従来の構文を拡張しているためです。

[実験的] range_filterコマンドのサポート

今回のリリースでは、 range_filter コマンドのサポートを追加しました。

これは select の簡易版で、条件を限定して高速化したコマンドです。

select ではマッチした件数を一緒に返しますが、 range_filter ではそれをやらないというのがポイントです。

ただし、必要なデータが取得できた時点で走査を打ち切る特性から drilldown のようなグループ化して結果を返すものには適用できません。マッチしたものすべてをあらかじめ知っておかないといけないからです。

そのため、ランキングの上位N件だけを取得したいときなど全体の件数までは知らなくていいような検索に向いています。

groonga-httpdがデフォルトのHTTPサーバーになりました

これまで、GroongaのHTTPサーバーはgroonga-server-httpパッケージをまずは使ってね、というスタンスだったのでした。ただ、HTTPサーバーのパッケージが複数あるのはわかりにくいというのと groonga-httpd が登場してそれなりに経つということで、パッケージは groonga-httpd に一本化することにしました。

groonga-server-http をアップデートすると groonga-httpd にきりかわるようになっています。

groonga-server-httpgroonga-httpd ではたくさんの違いがあります。どう違うかについては、 比較のページ を用意しているのでそちらを確認してください。

groonga-httpd 特有の ディレクティブ もあるので参考にしてください。

Groonga本体のHTTPサーバーとしての機能は削除していないので、コマンドラインからこれまで通り使うことができます。

さいごに

4.0.7からの詳細な変更点は 4.0.8リリース 2014/11/29 を確認してください。

それでは、Groongaでガンガン検索してください!