Aggregationって?
FacetsAPIの上位版です。集計する機能です。SQLならGROUP BY
に相当します。
maxやavgといった複雑な条件で集約を行えます。
大谷さんの以下のスライドが非常にわかりやすいです。
BucketとMetrics
AggregationはBucketとMetricsで成り立ってます。
名称 | 役割 | 例 |
---|---|---|
Bucket | 検索結果を指定した条件に分類 | レストランの場所:「東京」「大阪」 ツイートの言語:「日本語」「英語」 |
Metrics | Bucketのデータを計算 | Bucket内のドキュメント数 売上の最大値 |
Elasticsearchの機能としては以下のような感じです。
名称 | 機能 |
---|---|
Bucket | filter, terms, nested, children, range |
Metrics | min, max, sum, avg, top_hits, percentiles |
クエリの基本構造
{ "query": { // 各種クエリ }, "size": 10, "from": 0, "aggs": { // aggregationの設定 } }
各種クエリはElastic - Queriesに載ってるやつです。
Bucketだけ使ってみる
{ "aggs" : { "genders" : { ←任意。レスポンスの時にこの名前で返る "terms" : { "field" : "gender" } } } }
Metricsだけ使ってみる
Min Aggregationのケース
{ "aggs" : { "min_price" : { ←任意。レスポンスの時にこの名前で返る "min" : { "field" : "price" } } } }
Bucketで分類後、Metricsで集計する
Top Hits Aggregationを使ってみます。
以下は「検索結果をジャンルごとに分けて、各ジャンルTOP10のデータがほしい」といったケースです。
{ "aggs": { "top-tags": { ←任意。レスポンスでこの名前で返る "terms": { // Bucketに入れる "field": "genre" }, "aggs": { "top_tag_hits": { ←任意。レスポンスでこの名前で返る "top_hits": { // Metricsで集計 "size" : 10 } } } } } }
Aggregationを組み合わせたいときはこのようにネストさせていきます。
レスポンスもネストして返ってきます。