elasticsearch - ElasticSearch中唯一聚合doc_count的计数

标签 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条日志行。

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

最佳答案

听起来您可以使用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/

相关文章:

elasticsearch - Elasticsearch 中的聚合计数/总和

php - ElasticSearch Laravel侦察异常(exception)

elasticsearch - 使用Elasticsearch,如何在filter-> terms查询中使用OR而不是AND?

api - 在Elasticsearch上查询每种类型的最新文档

python - 过滤后的汇总无结果

curl - 移动聚合 ElasticSearch

elasticsearch - Packetbeat不添加Kubernetes元数据

algorithm - elasticsearch Geo_Polygon过滤算法

elasticsearch:使用聚合值进行过滤

elasticsearch - Elasticsearch支持区分大小写和不区分大小写