集約の実行
edit集約の実行
editアグリゲーションを使用すると、データの統計情報をグループ化したり展開したりすることができます。集約について考える上で最も簡単な方法は、集約とSQL GROUP BY機能およびSQL集約機能を同等とみなすことです。Elasticsearchでは、ヒットを返す検索を実行すると同時に、ヒットとは別の集約された結果を1つの応答にまとめて返すことができます。これは、クエリと複数の集約を実行し一回で両方(またはいずれか)の操作から結果を得ることができ、簡潔で単純化されたAPIを使用してネットワークの往復を回避するという点で、非常に強力で効率的です。
まず、次の例はすべての口座を州ごとにグループ化して、数を降順にソート(デフォルト)した上位10個(デフォルト)の州を返します。
GET /bank/_search { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" } } } }
SQLでは、上記の集約は次の考え方と類似しています。
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
次のような応答が返ります(部分的に表示)。
{ "took": 29, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits" : { "total" : 1000, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "group_by_state" : { "doc_count_error_upper_bound": 20, "sum_other_doc_count": 770, "buckets" : [ { "key" : "ID", "doc_count" : 27 }, { "key" : "TX", "doc_count" : 27 }, { "key" : "AL", "doc_count" : 25 }, { "key" : "MD", "doc_count" : 25 }, { "key" : "TN", "doc_count" : 23 }, { "key" : "MA", "doc_count" : 21 }, { "key" : "NC", "doc_count" : 21 }, { "key" : "ND", "doc_count" : 21 }, { "key" : "ME", "doc_count" : 20 }, { "key" : "MO", "doc_count" : 20 } ] } } }
口座が`ID`(アイダホ)に27個、TX
(テキサス)に27個、AL
(アラバマ)に25個などとなっていることがわかります。
応答に集約結果だけを表示するようにするため、`size=0`を設定して検索ヒットを表示しないようにします。
前の集約を基にして、次の例は州ごとに平均の口座残高を計算します(数を降順にソートした上位10個の州)。
GET /bank/_search { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }
`average_balance`集約が`group_by_state`集約にどうネストされているかに注目してください。これは、すべての集約に共通のパターンです。集約内に集約を任意にネストして、ピボットされた必要な要約をデータから抽出できます。
では、前の集約を基にして、平均残高を降順にソートしてみましょう。
GET /bank/_search { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state.keyword", "order": { "average_balance": "desc" } }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }
次の例は、年齢層(20~29歳、30~39歳、および40~49歳)でグループ化してから性別でグループ化し、年齢層ごと、性別ごとの平均口座残高を得る方法を示しています。
GET /bank/_search { "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender.keyword" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } } }
ここでは説明しませんが、ほかにも集約の機能はたくさんあります。さらに試してみたい場合は、まず集約リファレンスガイドを読むことをお勧めします。