使用elasticsearch_dsl进行嵌套(?)聚合

时间:2017-10-31 23:53:57

标签: elasticsearch elasticsearch-dsl

我不确定我是否正确使用了这些词,但基本上我想使用elasticsearch_dsl进行聚合

  1. 按日期分开

  2. 按app分开

  3. 计算唯一身份用户ID

  4. 为1,我知道我必须使用date_histogram,但是,对于2和3,我不确定如何形成我的命令

    对于映射,它看起来像:

    "protperties":{
        "app": {"field1": {......},
                "name": "....",
                "id": 1
        },
        "time": {......},
        "user": {"id": 2,
                 "field3": ......
        }
    }
    

    所以app.id和user.id都是嵌套的

    我的目标是获得一个看起来像

    的json对象
    {'users': {
        'app1': {date_1: 1}, 
        'app2': {date_2: 1}, 
        'app3': {date_3: 1}}}
    

    其中app1,app2和app3是应用名称

    我尝试使用s.aggs.bucket('app.name_na', 'date_histogram', field='time', interval='day').bucket('app', app_agg).bucket('users', id_agg) app_aggip_agg正在使用A来构建{'terms': {'field': 'app.name'}, 'aggs': {'users': {'cardinality': {'field': 'user.id'}}}}{'cardinality': {'field': 'user.id'}},或者某些变体这个命令,但结果要么不能形成,要么不是我正在寻找的。我想知道如何使用elasticsearch_dsl

    形成正确的命令

1 个答案:

答案 0 :(得分:0)

对于您想要的嵌套聚合 -

  
      
  1. 按日期分开
  2.   
  3. 按app分开
  4.   
  5. 统计唯一身份用户ID
  6.   

我会选择:

{
  "size": 0,
  "aggregations": {
    "dates_agg": {
      "date_histogram": {
        "field": "time",
        "interval": "1d"
      },
      "aggregations":{
        "apps_agg":{
          "terms":{
            "field": "app"
          },
          "aggregations":{
            "users_agg":{
              "terms":{
                "field": "user"
              }
            }
          }
        }
      }
    }
  }
}

说明:

dates_agg - 将按分隔,您可以定义不同的间隔 Time Units

apps_agg - 将app使用Terms Aggregation分隔 - 术语聚合还会计算每个广告资源的文档编号。

users_agg - 将user分隔,此时此应用的用户数量将为存储桶数量。