弹性搜索和子查询的聚合

时间:2014-09-12 12:16:04

标签: elasticsearch aggregation

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

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

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

注意:我已经看到了Elastic Search and "sub queries"的问题,但它是关于其他事情的,并且它已经超过一年半了,而且正在积极开发弹性搜索。

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

1 个答案:

答案 0 :(得分:2)

这是我使用的查询,请注意" 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。