HAYASHI Kentaro
null+****@clear*****
Sat Nov 29 11:48:34 JST 2014
HAYASHI Kentaro 2014-11-29 11:48:34 +0900 (Sat, 29 Nov 2014) New Revision: e97a219a280ef19ec9ef11f08f97db9910dddd07 https://github.com/groonga/groonga.org/commit/e97a219a280ef19ec9ef11f08f97db9910dddd07 Message: Add Groonga 4.0.8 release entry Added files: ja/_posts/2014-11-29-release.md Added: ja/_posts/2014-11-29-release.md (+195 -0) 100644 =================================================================== --- /dev/null +++ ja/_posts/2014-11-29-release.md 2014-11-29 11:48:34 +0900 (c08e016) @@ -0,0 +1,195 @@ +--- +layout: post.ja +title: Groonga 4.0.8リリース +description: Groonga 4.0.8をリリースしました! +--- + +## Groonga 4.0.8リリース + +今日はいい肉の日ですね をリリースしました! + +それぞれの環境毎のインストール方法: [インストール](/ja/docs/install.html) + +### 変更内容 + +今回はいくつか実験的な機能が追加されています。興味のある方はぜひ試してみてフィードバックをおねがいします。 + + * [実験的] 逐次検索への自動切り替えのサポート (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 + +試してみて閾値はこれくらいに設定するのがウチの場合はよかった、などフィードバックをもらえると嬉しいです。 + +詳細は[between](/ja/docs/reference/functions/between.html)や[in_values(まだドキュメント化が追いついていない)](/ja/docs/reference/functions/in_values.html)のドキュメントを参照してください。 + +#### [実験的] 複数のキーによるドリルダウンのサポート + +今回のリリースでは、複数のキーによるドリルダウンのサポートを追加しました。 + +これにより、大項目、中項目、小項目といった項目でグループ化した結果を簡単に取得することができるようになりました。これまでは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-http` と `groonga-httpd` ではたくさんの違いがあります。どう違うかについては、 [比較のページ](/ja/docs/server/http/comparison.html) を用意しているのでそちらを確認してください。 + +`groonga-httpd` 特有の [ディレクティブ](/ja/docs/reference/executables/groonga-httpd.html) もあるので参考にしてください。 + +Groonga本体のHTTPサーバーとしての機能は削除していないので、コマンドラインからこれまで通り使うことができます。 + +### さいごに + +4.0.7からの詳細な変更点は [4.0.8リリース 2014/11/29](/ja/docs/news.html#release-4-0-8) を確認してください。 + +それでは、Groongaでガンガン検索してください! -------------- next part -------------- HTML����������������������������...Download