elasticsearch-包含大量存储桶的子聚合

3vpjnl9f  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(329)

我们有一个包含大量用户报告的索引(百万分之一百)。假设大多数用户都有报表,我们需要计算每个用户的一些统计信息。例如,在特定的时间间隔内,有多少用户平均每周有10-15份、15-20份、20-30份报告。请注意,我们不需要在响应中返回bucket本身,但它们需要由计算平均值和范围的子聚合进行评估。据我了解,elasticsearch对存储桶的数量有限制,不建议将其增加到数百万个。我读过关于分页的复合聚合的文章,但我认为这不适合这种情况,因为我们需要计算聚合数而不是返回桶。
下面是我们当前查询的简化版本。我们要计算两个日期之间具有x1-x2月度报告的使用次数。
按用户id存储报告。
使用bucket selector仅选择具有y-z报告之间的用户(y1和y2由客户端预先计算-这些数字将解析为x1-x2月报告之间的平均值)。
计算剩余的桶数
问题是,最初的bucketing(术语聚合)只会返回相对较少的bucket(而不是数百万),因此只会对少量用户进行评估。实现这一目标的最佳方法是什么?

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"
             }
         }
     }
}
kdfy810k

kdfy810k1#

我基本上看到了3个优化,它们都共享一个Map→ 联合方法:
用您选择的语言编写一个脚本,将1y范围拆分为月/周,运行查询,并合并结果。
在运行术语聚合之前应用某种过滤器——首先计算最有价值用户的用户统计数据(按收入、每日活跃使用量等挑选),然后计算其余用户的统计数据。然后合并。
预先将用户分组,比如说,使用名字的首字母,然后运行 terms 这些组中的AGG。然后合并。

相关问题