Carpe Diem

備忘録。https://github.com/jun06t

ElasticSearch の Aggregation 機能

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だけ使ってみる

Terms Aggregationのケース

{
    "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を組み合わせたいときはこのようにネストさせていきます。
レスポンスもネストして返ってきます。

ソース