弹性搜索和子查询的聚合

我知道elasticsearch允许
sub-aggregations(即嵌套聚合),但是我想对“第一”聚合的结果应用聚合(或者在通用的任何查询 – 聚合或不聚合).

具体示例:我记录有关用户操作的事件(为简单起见,我有使用user_id和action的文档).我可以创建一个查询,计算每个用户执行的操作数.但是,我想找出“活跃用户”的百分比(或计数)(例如,执行了超过10个操作的用户).理想的结果将是所有用户显示用户活跃程度的histogram.

有没有办法如何创建这样的查询?或者除了存储子查询的聚合结果并计算直方图外,还有其他方法吗?

注意:我已经看到了Elastic Search and “sub queries”问题,但它是关于其他的东西,它已经超过一年半了,而且弹性搜索正在积极开发中.

此外,似乎在版本1.4中将有可用的脚本度量聚合,但无论如何需要为每个用户存储计数器,直到减少阶段.一些“近似解决方案”对我有好处 – 类似于ES使用internally for its aggregations.

最佳答案 这是我使用过的查询,注意聚合中的“min_doc_count”.

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          { "term" : { "name": "did x" } },
          { "range": { "created_at": { "gte": "now-7d", "lte": "now" } } }
        ]
      }
    }
  },
  "aggregations": {
    "my_agg": {
      "terms": {
        "field": "user_id",
        "min_doc_count": 10,
        "size": 0
      }
    }
  }
}

此查询返回指定时间段内包含9个以上事件的存储桶(用户)列表.只需’计数’即可获得活跃用户数.

我已经用成千上万的事件测试了这种方法并且运行良好.在某种程度上,您将不得不使用Hadoop.

点赞