
实现类似 SQL 里面 group by 分组去重之后分页输出列表。
我的做法如下:
用的是composite桶聚合获取一页的数据,下一页用after参数。
获取到一页数据列表之后,拿到 id 列表再去主表里面查询具体的数据。
agg 部分:
'aggs' => [ 'uid' => [ 'composite' => [ 'size' => 20, 'sources' => [ [ 'uid' => [ 'terms' => [ 'field' => 'uid', 'order' => 'desc', ], ], ], ], ], ] 用 uid 聚合和排序
用的cardinality和sum_bucket组和。
聚合之后在计算桶的总数,size 设置一个比较大的数。
agg 部分:
'aggs' => [ 'uid' => [ 'terms' => [ 'field' => 'uid', 'size' => 5000, ], 'aggs' => [ 'uid_count' => [ 'cardinality' => [ 'field' => 'uid', ], ], ], ], 'sun_uid' => [ 'sum_bucket' => [ 'buckets_path' => 'uid>uid_count', ], ], ] 方法对不对呀?总感觉 es 做分页列表输出不是太好,只能获取下一页。
ui 需求分页需求是可以跳页,随便点哪页的,用 es 的话,一般怎么满足的?还是说满足不来,只能改需求了。
1 smart9527 2020-11-16 17:06:02 +08:00 via iPhone 用 from, size |
2 DavinBin23 2020-11-16 18:11:58 +08:00 使用 Terms Aggregation,按照某些字段分组聚合,得到 n 个桶,桶里面装的是分组的数据,再用 bucket_sort 对桶进行分页 |
4 dyllen OP @DavinBin23 我去试了下,我用某个字段分组聚合,用另一个字段排序是不是就不行了? |
5 DavinBin23 2020-11-17 14:02:22 +08:00 @dyllen 可以的,bucket_sort 支持 "bucket_sort": { "sort": { "xxx": { "ordr": "desc" } }, "from": 10, "size": 10 } |