Elasticsearch - 总和与组

时间:2019-02-01 19:16:47

标签: elasticsearch

我无法应用链式聚合的概念...在这种情况下我需要帮助:
我的文档如下:

{
  "date":"2019-01-30",
  "value":1234.56,
  "partnerId":9876
}

和我想通过日期(月)滤波器和由合作伙伴ID概括它们,然后计数它,从而获得像结果:

{
   "partnerId": 9876,
   "totalValue": 12345567.87,
   "count": 6574
}

如何将这个查询什么样子?

1 个答案:

答案 0 :(得分:3)

您要实现的目标可以通过子聚合来完成,换句话说,就是在聚合内部进行聚合。

对于您的情况,首先要按parternId分组,因此您需要在parternId字段上输入terms aggregation。让我们将此聚合称为partners。这将为您提供预期结果的两个值parternIdcount

现在,对于partnerId的每个组(存储桶),都需要totalValue,即每个partnerId的总和为value。这可以通过在术语聚合partners中添加sum aggregation来完成。因此,最终查询以及日期(月份)过滤器将为:

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "date": {
            "gte": "2019-01-01",
            "lte": "2019-01-31"
          }
        }
      }
    }
  },
  "aggs": {
    "partner": {
      "terms": {
        "field": "partnerId"
      },
      "aggs": {
        "totalValue": {
          "sum": {
            "field": "value"
          }
        }
      }
    }
  }
}

采样结果(仅用于汇总):

"aggregations": {
    "partner": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 9876,
          "doc_count": 3,
          "totalValue": {
            "value": 3704.68017578125
          }
        },
        {
          "key": 9878,
          "doc_count": 2,
          "totalValue": {
            "value": 2454.1201171875
          }
        }
      ]
    }

key以上的结果是partnerIddoc_countcount,而totalValue.value是您的预期结果的totalValue