使用ElasticSearch 7.0,通过聚合我可以为每个用户获得多少日志:
"aggs": {
"by_user": {
"terms": {
"field": "user_id",
}
}
}
这会给我类似的信息:
user32: 25
user52: 20
user10: 20
...
我想知道多少用户有25条日志,多少用户有20条日志,等等。理想的结果是:
25: 1
20: 2
19: 4
12: 54
因为54个用户有12条日志行。
如何进行聚合以返回此结果?
最佳答案
听起来您可以使用Bucket Script Aggregation简化查询,但问题是仍然存在open PR on this topic。
因此,现在我认为最简单的方法是将无痛脚本与Scripted Metric Aggregation一起使用。我建议您仔细阅读其执行的各个阶段。
就代码而言,我知道这不是解决问题的最佳算法,但是查询又快又脏,看起来可能像这样:
GET my_index/_search
{
"size": 0,
"query" : {
"match_all" : {}
},
"aggs": {
"profit": {
"scripted_metric": {
"init_script" : "state.transactions = [:];",
"map_script" :
"""
def key = doc['firstName.keyword'];
if (key != null && key.value != null) {
def value = state.transactions[key.value];
if(value==null) value = 0;
state.transactions[key.value] = value+1
}
""",
"combine_script" : "return state.transactions",
"reduce_script" :
"""
def result = [:];
for (state in states) {
for (item in state.entrySet()) {
def key=item.getValue().toString();
def value = result[key];
if(value==null)value = 0;
result[key]=value+1;
}
}
return result;
"""
}
}
}
}
关于elasticsearch - ElasticSearch中唯一聚合doc_count的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56258513/