1

我有映射数据和示例如下:

{ 
   date : 'yyyy-mm-dd',
   action : 'click',
   userId : 'not_analysed id in this field',
   user : {
     name : 'John',
     age : '28',
     email : 'john@awesome.com',
     country : 'US'
   }
}

我将拥有数百万条这样的记录,这些记录也有重复,因为它是用户活动日志,我想使用日期列根据日期直方图中的唯一 userId 对它们进行分组。使用基数根据日期直方图获取唯一计数非常简单。

如果我想根据唯一的用户存储桶获得最终结果并对用户字段进行分组并根据他们的个人资料获取他们的计数,如下所示。假设在 1 月份,我们有大约 10,000 个活动,但只有 1,000 个唯一用户,并且基于这些用户,我们希望获取用户字段数据以查看人口统计数据。意思是 10,000 条记录,如果对 userId 执行基数,我将有 1,000 条记录。基于这 1,000 条记录,我需要得到如下结果。如何将 10,000 条记录合并为不同的 1,000 条记录,并从这些记录中得出以下答案。

Expected end results:
{
    '2016-01-01',
    aggs: {
        [{
            age: 28,
            count: 100
        }, {
            age: 27,
            count: 500
        }, {
            country: 'US',
            count: 200
        }, {
            country: 'Canada',
            count: 200
        }]
    },
    '2016-02-01',
    aggs: {
        [{
            age: 29,
            count: 200
        }, {
            age: 31,
            count: 1000
        }, {
            country: 'Mexico',
            count: 400
        }, {
            country: 'UK',
            count: 400
        }]
    }

总之,是否有任何通用的方法来计算,然后通过使用术语甚至使用管道聚合来计算结果?

请帮忙。

4

1 回答 1

0

您需要的是主要日期直方图聚合下的 3 个不同的子聚合。您的查询将与此类似。

该查询由terms聚合agecountry数据以及cardinality唯一用户数的计数组成。

您可以增加每个术语聚合的大小以获得所需的结果。

{
  "aggs": {
    "user_data_over_time": {
      "date_histogram": {
        "field": "date",
        "interval": "day", 
        "format": "yyyy-MM-dd"
      },
      "aggs": {
        "unique_users": {
          "cardinality": {
            "field": "userId"
          }
        },
        "age_data":{
          "terms": {
            "field": "user.age",
            "size": 10
          }
        },
        "country_data":{
          "terms": {
            "field": "user.country",
            "size": 10
          }
        }
      }
    }
  }
}
于 2016-07-30T12:43:30.467 回答