V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dyllen
V2EX  ›  Elasticsearch

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

  •  1
     
  •   dyllen · 2020-11-16 16:00:25 +08:00 · 4233 次点击
    这是一个创建于 1466 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2020-11-17 14:02:22 +08:00
    smart9527
        1
    smart9527  
       2020-11-16 17:06:02 +08:00 via iPhone
    用 from, size
    DavinBin23
        2
    DavinBin23  
       2020-11-16 18:11:58 +08:00
    使用 Terms Aggregation,按照某些字段分组聚合,得到 n 个桶,桶里面装的是分组的数据,再用 bucket_sort 对桶进行分页
    dyllen
        3
    dyllen  
    OP
       2020-11-17 08:58:12 +08:00
    @smart9527 这个我知道,聚合用不了,分页数据有限。
    dyllen
        4
    dyllen  
    OP
       2020-11-17 10:28:57 +08:00
    @DavinBin23 我去试了下,我用某个字段分组聚合,用另一个字段排序是不是就不行了?
    DavinBin23
        5
    DavinBin23  
       2020-11-17 14:02:22 +08:00
    @dyllen 可以的,bucket_sort 支持
    "bucket_sort": {
    "sort": {
    "xxx": {
    "order": "desc"
    }
    },
    "from": 10,
    "size": 10
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3648 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:37 · PVG 18:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.