有没有 elasticsearch 熟悉的大佬,分组聚合分页的问题

2020-11-16 16:00:25 +08:00
 dyllen

实现类似 SQL 里面 group by 分组去重之后分页输出列表。

我的做法如下:

  1. 获取当前页的数据列表

用的是composite桶聚合获取一页的数据,下一页用after参数。

获取到一页数据列表之后,拿到 id 列表再去主表里面查询具体的数据。

agg 部分:

'aggs' => [
    'uid' => [
        'composite' => [
        	'size' => 20,
        	'sources' => [
                [
                    'uid' => [
                        'terms' => [
                        'field' => 'uid',
                        'order' => 'desc',
                    ],
        		],
        	],
        ],
    ],
]

用 uid 聚合和排序

  1. 获取数据总数

用的cardinalitysum_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 的话,一般怎么满足的?还是说满足不来,只能改需求了。

4035 次点击
所在节点    Elasticsearch
5 条回复
smart9527
2020-11-16 17:06:02 +08:00
用 from, size
DavinBin23
2020-11-16 18:11:58 +08:00
使用 Terms Aggregation,按照某些字段分组聚合,得到 n 个桶,桶里面装的是分组的数据,再用 bucket_sort 对桶进行分页
dyllen
2020-11-17 08:58:12 +08:00
@smart9527 这个我知道,聚合用不了,分页数据有限。
dyllen
2020-11-17 10:28:57 +08:00
@DavinBin23 我去试了下,我用某个字段分组聚合,用另一个字段排序是不是就不行了?
DavinBin23
2020-11-17 14:02:22 +08:00
@dyllen 可以的,bucket_sort 支持
"bucket_sort": {
"sort": {
"xxx": {
"order": "desc"
}
},
"from": 10,
"size": 10
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/725833

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX