使用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条日志行。
如何进行聚合以返回此结果?
答案 0 :(得分:2)
听起来您可以使用Bucket Script Aggregation简化查询,但是问题是仍然有open PR on this topic。
因此,就目前而言,我认为最简单的方法是使用Scripted Metric Aggregation的无痛脚本。我建议您仔细阅读其执行的各个阶段。
就代码而言,我知道这不是解决问题的最佳算法,但查询又快又脏,看起来可能像这样:
let bufffer = "";
command.stdout.on('data', (data) => {
buffer = buffer + data;
while (buffer.indexOf('\n') != -1) { // loop because in some cases you can even receive many lines
const idx = buffer.indexOf('\n');
const line = buffer.substr(0, idx).trim(); // get line and trim extra whitespace
buffer = buffer.substr(idx+1); // rest of buffer, usually empty string
// now parse line with regexp or something
const match = /(\d+) (\d+) ms +(\d+) ms +(\d+) ms ([^ ]+)/.match(line);
if (match) {
...
}
}
});