【问题标题】:Unique term within bucket in elasticsearchelasticsearch中桶内的唯一术语
【发布时间】:2016-07-30 11:40:51
【问题描述】:

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

{ 
   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
        }]
    }

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

请帮忙。

【问题讨论】:

  • 我下面的解决方案是否解决了您的问题?

标签: elasticsearch elasticsearch-2.0 elasticsearch-aggregation


【解决方案1】:

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

查询由agecountry 数据的terms 聚合和唯一用户数的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
          }
        }
      }
    }
  }
}

【讨论】:

  • 是的,这会得到计数,但 user.age 是基于总记录而不是不同 userId 的数量。
  • @Nick 所以你的 userId 和 user 不相关,你需要每个 userId 的年龄吗?您能否根据您提供的示例阐明您对输出的要求,其中 100 个是唯一用户,其中 100 个是 28 岁,500 个是 27 岁。如果这是要求,那么上面的查询肯定会起作用。
  • 假设总记录为 10,000 条,在这 10,000 条中包含多个重复的 userId。那么,userId 的可区分数为 1,000。基于这 1,000 个不同的用户,我还需要年龄和国家/地区分组。因此,年龄分组将仅基于 1,000,但实际记录为 10,000。
  • 很抱歉再次造成混乱。为了澄清,我需要不同年龄组和国家组的数量。这意味着基数是我需要为年龄组和国家组组合的总数。假设我有 1,000 个基于基数的唯一用户。然后基于这些数字 1,000,我需要为年龄和国家/地区组合总共 1,000 个组合。希望这清楚。
  • 上述查询对你的情况有效,你试过了吗?
猜你喜欢
  • 2021-06-06
  • 2014-07-19
  • 2021-06-06
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多