【问题标题】:Count of unique aggregration doc_count in ElasticSearchElasticSearch 中唯一聚合 doc_count 的计数
【发布时间】:2019-10-09 01:00:24
【问题描述】:

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

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

【问题讨论】:

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

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

【讨论】:

  • 我真的怀疑这是否可以使用bucket script aggregation。你提出的那个似乎是实现它的唯一方法!绝妙的解决方案!
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多