python - 如何使用 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}
解决方案
如果您像那样单独执行它,它会被视为 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
}
}
]
}
}
}
我希望这回答了你的问题。
推荐阅读
- java - 在 Java 中,ArrayList 始终读取为 .size() 0 到 while 循环,即使它是在创建时实现的
- java - 关于客户端锁定(同步块)的 CoreJava 第 11 版线程问题
- ruby-on-rails - 此代码中引用的模型关联行的 3.1 版本在哪里
- jquery - 滚动停止时,浮动 div “捕捉”到最近的 tr
- javascript - 如果使用具有相同值的分组列表,如何获得唯一的活动元素
- node.js - 提高 Redis Lua 脚本性能
- pyspark - pyspark 只删除连续的重复行
- reactjs - 在春天增加 spring.servlet.multipart.max-file-size?
- idris - Idris2 中的通用增量函数
- python - python – 我在 cpanel 上的 django 网站不会加载我的媒体文件,但当 DEBUG=True 时,我所有的 stacticfiles 和媒体都可以工作