【发布时间】:2021-04-02 22:02:57
【问题描述】:
我们有一个包含大量用户报告的索引(数百万 / 数千万)。 假设大多数用户都有报告,我们需要计算每个用户的一些统计数据。 例如,有多少用户在特定时间间隔内每周平均有 10-15、15-20、20-30 份报告。 请注意,我们不需要在响应中返回存储桶本身,但它们需要由计算平均值和范围的子聚合进行评估。据我了解,elasticsearch对bucket的数量是有限制的,不建议增加到百万。 我已经阅读了关于分页的复合聚合,但我认为这不适合这种情况,因为我们需要计算聚合数而不是返回存储桶。
以下是我们当前查询的简化版本。 我们想要计算两个日期之间 X1-X2 月度报告的使用次数。
- 按用户 ID 存储报告。
- 使用存储桶选择器仅选择具有 YZ 报告之间的用户(Y1 和 Y2 由客户预先计算 - 这些数字将解析为 X1-X2 月报告之间的平均值)。
- 计算剩余的桶数
问题在于,原来的分桶(terms 聚合)只会返回相对少量的桶(不是数百万),所以只会评估少量的用户。 实现这一目标的最佳方法是什么?
POST /reports/_search
{
"size": 0,
"query": {
"range": {
"timestamp": {
"gte": "2020-01-01T00:00:00.000Z",
"lte": "2020-12-24T23:59:59.999Z",
"format": "strict_date_optional_time"
}
}
},
"aggs": {
"distinctIds_less_than_monthly": {
"terms": {
"field": "userId" // this will only return a small amount of buckets
},
"aggs": {
"less_than_monthly": {
"bucket_selector": {
"buckets_path": {
"distinctUsers": "distinctUsers_less_than_monthly.value"
},
"script": "params.distinctUsers > 1000 && params.distinctUsers < 1500"
}
},
"distinctUsers_less_than_monthly": {
"value_count": {
"field": "userId"
}
}
}
},
"userCount_less_than_monthly": {
"stats_bucket": {
"buckets_path": "distinctIds_less_than_monthly._count"
}
}
}
}
【问题讨论】:
标签: database elasticsearch elasticsearch-aggregation