ElasticSearch中唯一聚集doc_count的计数

时间:2019-05-22 13:54:58

标签: elasticsearch elasticsearch-aggregation

使用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条日志行。

如何进行聚合以返回此结果?

1 个答案:

答案 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) {
             ...
         }
    }
});