首页 > 解决方案 > 如何使用 Elasticsearch 在日期范围内使用 id 条件获取值的总和?

问题描述

我正在尝试编写一个查询来获取每个月具有特定 ID 的文档的值的总和。为此,我正在尝试:

query = {
    "size": 0,
    "aggs" : {
        "articles_over_time" : {
            "date_histogram" : {
                "field" : "timestamp",
                "interval" : "month"
            }
        },
        "value": {
            "sum": {
                "field": "generatedTotal"
            }
        }
    }
}  

这个查询会给我generatedTotal每月的总和,但它给我generatedTotal所有文档的总和。如何指定获取generatedTotal特定的每月总和generatorId

Elasticsearch 索引中的文档示例:

{'id': 0, 'timestamp': '2018-01-01', 'generatorId': '150', 'generatedTotal': 2166.8759558092734}

标签: pythonelasticsearch

解决方案


如果您像那样单独执行它,它会被视为 2 个不同的聚合。您首先需要查询您想要的特定 generatorId,然后在第一个 aggs 中执行第二个 aggs:

{
    "size": 0,
    "query": {
        "term": {
            "generatorId": "150"
        }
    },
    "aggs": {
        "articles_over_time": {
            "date_histogram": {
                "field": "timestamp",
                "interval": "month"
            },
            "aggs": {
                "monthlyGeneratedTotal": {
                    "sum": {
                        "field": "generatedTotal"
                    }
                }
            }
        }
    }
}

4 个示例文档(1 个具有不同的 generatorId,并且不计入聚合中)

{"timestamp": "2018-02-01", "generatedTotal": 3, "generatorId": "150"}
{"timestamp": "2018-01-01", "generatedTotal": 1, "generatorId": "150"}
{"timestamp": "2018-01-01", "generatedTotal": 2, "generatorId": "150"}
{"timestamp": "2018-01-01", "generatedTotal": 2, "generatorId": "160"}

然后您将获得如下聚合:

{
"aggregations": {
    "articles_over_time": {
      "buckets": [
        {
          "key_as_string": "2018-01-01T00:00:00.000Z",
          "key": 1514764800000,
          "doc_count": 2,
          "monthlyGeneratedTotal": {
            "value": 3.0
          }
        },
        {
          "key_as_string": "2018-02-01T00:00:00.000Z",
          "key": 1517443200000,
          "doc_count": 1,
          "monthlyGeneratedTotal": {
            "value": 3.0
          }
        }
      ]
    }
  }
}

我希望这回答了你的问题。


推荐阅读