Elasticsearch

Elasticsearchのaggregationsのサンプル


あるtypeの月ごとの件数をカウントする必要があり、
頑張って調べたのでメモ。

リクエストのサンプル

GET index_name/type_name/_search
{
  "size": 0, 
  "query": {
    "filtered": {
      "filter": {
        "range": {
          "{{ sample_time }}": {
            "gte": xxxxxxxxxxx
          }
        }
      }
    }
  },
  "aggs": {
    "{{ monthly_count }}": {
      "date_histogram": {
        "field": "{{ sample_time }}",
        "interval": "month",
        "time_zone": "+9:00",
        "order": {
          "_key": "desc"
        }
      }
    }
  }
}
  • sizeは、条件にヒットするドキュメントが出力されるのが邪魔なので0にした
  • queryで集計するドキュメントの条件を絞れる(例はsample_timeがある日付以降)
  • aggsからが集計の条件

aggsの各パラメータの意味

"aggs": {
    "{{ 適当な名前をつける }}": {
      "date_histogram": {             # date_histgramを指定すると日付の間隔でbucketを作れるらしい
        "field": "{{ sample_time }}", # 集計するキーとなるフィールド
        "interval": "month",          # 月ごとに集計したいのでmonth
        "time_zone": "+9:00",         # タイムゾーンを調整できる(utcだったので+9時間した)
        "order": {
          "_key": "desc"              # 集計結果をソート可能
        }
      }
    }
}

レスポンスのサンプル

{
   "took": xxx,
   "timed_out": false,
   "_shards": {
      "total": xxx,
      "successful": xxx,
      "failed": 0
   },
   "hits": {
      "total": xxx,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "{{ 適当につけた名前 }}": {
         "buckets": [
            {
               "key": 1522540800,  # 降順で月ごとの件数が集計された
               "doc_count": 300    # 対象月の件数
            },
            {
               "key": 1519862400,
               "doc_count": 400
            },
            {
               "key": 1517443200,
               "doc_count": 100
            }
         ]
      }
   }
}
  • 例は2018/02 ~ 2018/04の月ごとの集計結果、件数は適当です