# Aggregation の指定方法とレスポンスフォーマットについて

**URL:** <https://discuss.elastic.co/t/aggregation/53752>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [June 23, 2016, 8:50am UTC](https://discuss.elastic.co/t/aggregation/53752 "2016-06-23T08:50:20Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![holidayworking](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/holidayworking/32/10496_2.png) [@holidayworking](https://discuss.elastic.co/u/holidayworking)\
**Post date:** [June 23, 2016, 8:50am UTC](https://discuss.elastic.co/t/aggregation/53752/1 "2016-06-23T08:50:20Z")

</div>

初めまして。

Aggregation の指定方法とレスポンスフォーマットについて質問をさせて下さい。

# 経緯

下記のようなインデックスがあります。

```auto
curl -XGET localhost:9200/reviews/_mapping?pretty
{
  "reviews" : {
    "mappings" : {
      "review" : {
        "properties" : {
          "item_code" : {
            "type" : "string"
          },
          "comment" : {
            "type" : "string",
            "analyzer" : "text_cjk"
          },
          "rate" : {
            "type" : "integer"
          }
        }
      }
    }
  }
}

```

`rate` フィールドは 1 から 5 の値が登録されるようにアプリケーション側で制御しています。この `rate` フィールドについて平均値と値別の件数を集計するために Global Aggregation を使うことにしました。

```auto
curl -XGET localhost:9200/reviews/_search?pretty=true -d '{
  "aggregations": {
    "rate": {
      "global" : {},
      "aggregations": {
        "average": { "avg": { "field": "rate" } },
        "terms": { "terms": { "field": "rate" } }
       }
    }
  }
}'

```

`item_code` フィールドや `comment` フィールドを検索条件に指定したところ、Aggregation の結果は検索条件を無視したものでした。

```auto
curl -XGET localhost:9200/reviews/_search -d '{
  "query": {
    "filtered": {
      "query": {
        "match": { "comment": "elasticsearch" }
      },
      "filter": {
        "term": { "item_code": "item001" }
      }
    }
  },
  "aggregations": {
    "rate": {
      "global" : {},
      "aggregations": {
        "average": { "avg": { "field": "rate" } },
        "terms": { "terms": { "field": "rate" } }
       }
    }
  }
}'

```

そのため、ドキュメントを読み直したところ Global Aggregation は検索条件を無視するものであると理解し、検索条件で絞り込んだ結果から `rate` フィールドについて平均値と値別の件数を集計することも要件に含まれているため、Global Aggregation は使えないことが分かりました。

# やりたいこと

- `rate` フィールドについて平均値と値別の件数を集計
  - `item_code` フィールドや `comment` フィールドを検索条件に指定した場合は、検索条件で絞り込んだ結果から集計

- Global Aggregation のような条件指定、レスポンスフォーマットにしたい

```auto
{
  "aggregations" : {
    "rate" : {
      "doc_count" : 4,
      "average" : {
        "value" : 2.75
      },
      "terms" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [ {
          "key" : 1,
          "doc_count" : 2
        }, {
          "key" : 4,
          "doc_count" : 1
        }, {
          "key" : 5,
          "doc_count" : 1
        } ]
      }
    }
  }
}

```

Global Aggregation を使わずに下記のゆうに指定することをできないのでしょうか？

```auto
curl -XGET localhost:9200/reviews/_search -d '{
  "query": {
    "filtered": {
      "query": {
        "match": { "comment": "elasticsearch" }
      },
      "filter": {
        "term": { "item_code": "item001" }
      }
    }
  },
  "aggregations": {
    "rate": {
      "aggregations": {
        "average": { "avg": { "field": "rate" } },
        "terms": { "terms": { "field": "rate" } }
       }
    }
  }
}'

```

# 環境

- Amazon Elasticsearch Service を使う想定でいるため、Elasticsearch 1.5.2

---

<div class="post-metadata">

**Author:** ![johtani](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/johtani/32/44956_2.png) [@johtani](https://discuss.elastic.co/u/johtani)\
**Post date:** [June 24, 2016, 12:56pm UTC](https://discuss.elastic.co/t/aggregation/53752/2 "2016-06-24T12:56:25Z")

</div>

例えば、こんな感じに、複数階層や、同一階層に対して、複数のaggsが適用可能です。

[https://www.elastic.co/guide/en/elasticsearch/guide/current/\_one\_final\_modification.html](https://www.elastic.co/guide/en/elasticsearch/guide/current/_one_final_modification.html)

で、Aggsの構造の書式はこのような形になります。もう一度構造を比較して、エラーを見た方がいいんじゃないですか？

[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html#\_structuring\_aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html#_structuring_aggregations)

---

<div class="post-metadata">

**Author:** ![holidayworking](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/holidayworking/32/10496_2.png) [@holidayworking](https://discuss.elastic.co/u/holidayworking)\
**Post date:** [June 27, 2016, 7:10am UTC](https://discuss.elastic.co/t/aggregation/53752/3 "2016-06-27T07:10:57Z")

</div>

回答ありがとうございます。

教えて頂いたドキュメントを参考にして、下記のように実装することにしました。

```auto
curl -XGET localhost:9200/reviews/_search -d '{
  "query": {
    "filtered": {
      "query": {
        "match": { "comment": "elasticsearch" }
      },
      "filter": {
        "term": { "item_code": "item001" }
      }
    }
  },
  "aggregations": {
    "rate_average": { "avg": { "field": "rate" } },
    "rate_terms": { "terms": { "field": "rate" } }
  }
}'

```

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:47pm UTC](https://discuss.elastic.co/t/aggregation/53752/4 "2017-07-06T13:47:30Z")

</div>


