Java Elasticsearch按多个字段分组并对小时数求和(聚合)
我正在进行elasticsearch(1.5)查询,以获取用户的所有任务及其在一个时间间隔内各自的小时数。例如,2016年1月1日至2016年12月31日 到目前为止,我已经做到了这一点:Java Elasticsearch按多个字段分组并对小时数求和(聚合),java,
elasticsearch,Java,
elasticsearch,我正在进行elasticsearch(1.5)查询,以获取用户的所有任务及其在一个时间间隔内各自的小时数。例如,2016年1月1日至2016年12月31日 到目前为止,我已经做到了这一点: { "query": { "filtered": { "query" : { "bool" : { "must": { "term": { "userId": [1,2,3,4,
{
"query": {
"filtered": {
"query" : {
"bool" : {
"must":
{
"term": {
"userId": [1,2,3,4,5,6]
}
}
}
},
"filter": {
"range": {
"spentOn": {
"gte": "1451606400000", // 1st Jan
"lte": "1483142400000" // 31st Dec
}
}
}
}
},
"size":0,
"aggs": {
"group_by_interval": {
"date_histogram": {
"field": "spentOn",
"interval": "month",
"min_doc_count": 0,
"extended_bounds": {
"min": "1451606400000",
"max": "1483142400000"
}
},
"aggs": {
"group_per_project": {
"histogram": {
"field": "taskId",
"interval": 1
},
"aggs": {
"hours": {
"sum": {
"field": "hours"
}
}
}
}
}
}
}
}
上面的查询给出了以下结果:
{
...
[{
"key_as_string" : "2016-01-01T00:00:00.000Z",
"doc_count" : 10,
"group_per_project" : {
"buckets" : [{
"doc_count" : 1,
"key" : Task A,
"hours_per_taskAssignment" : {
"value" : 5
}
}, {
"doc_count" : 15,
"key" : Task B,
"hours_per_taskAssignment" : {
"value" : 60
}
}, {
"doc_count" : 1,
"key" :Task C,
"hours_per_taskAssignment" : {
"value" : 10
}
}
]
},
"key" : 1451606400000
}, {
"key_as_string" : "2016-02-01T00:00:00.000Z",
"doc_count" : 23,
"group_per_project" : {
"buckets" : [{
"doc_count" : 1,
"key" : Task A,
"hours" : {
"value" : 2
}
}, {
"doc_count" : 20,
"key" : Task B,
"hours" : {
"value" : 180
}
}
]
},
"key" : 1454284800000
}
...
]
但是,我需要用户对小时进行分组和汇总,而不是用户所有小时的汇总。例如在一月份:
{
"doc_count" : 2,
"key" : Task A,
{
"userId": 1
"hours": {"value": 2}
},
{
"userId": 2
"hours": {"value": 5}
}
}
我是否可以使用ElasticSearch 1.5实现上述结果,而不必循环遍历每个用户并获取总小时数,这样做会降低应用程序的性能
提前谢谢 嗨,安德烈,非常感谢你的回答。我尝试了您的解决方案,它为userId提供了以下内容:“key”:“\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0012\fb”。经过一些研究,我发现这是旧版本的一个问题()。您知道如何使用ES 1.5解决此问题吗?谢谢是预付款。哦,那个:-)。是的,具有相同字段和不同字段类型的不同类型可能会导致不同类型的问题。在2.x中有一个完整的大修,专门用于消除这些情况(积极地强制执行映射规则)。因此,您确实有一个包含多个类型的索引,其中包含
userId
字段,这些字段既有数字字段,也有string
?感谢Andrei的回答。成功了。:)我通过指定userId的数字版本修复了处理多种类型的问题。一旦修改了查询,它就运行得很好。再次感谢。
"aggs": {
"group_by_interval": {
"date_histogram": {
"field": "spentOn",
"interval": "month",
"min_doc_count": 0,
"extended_bounds": {
"min": "1451606400000",
"max": "1483142400000"
}
},
"aggs": {
"group_per_project": {
"histogram": {
"field": "taskId",
"interval": 1
},
"aggs": {
"per_user": {
"terms": {
"field": "userId"
},
"aggs": {
"hours": {
"sum": {
"field": "hours"
}
}
}
}
}
}
}
}
}