【ElasticSearch】常用聚合统计技巧集锦

本文介绍了ElasticSearch的高效分页策略——桶分页,利用管道聚合进行二次统计,以及如何实现聚合前后的过滤。同时,文章还探讨了类似Spark的struct字段捆绑聚合——Top_Hits,用于在分组时保留其他字段信息。
摘要由CSDN通过智能技术生成

一、桶分页

相较于Scroll召回数量大且吃内存严重,和SearchAfter滚动排序参数的难以维护,桶分页提供了更优化的分页召回思路:即在内存中基于全量数据排序,基于一页数据召回,减少了网络传输并避免了维护排序参数的繁琐。

{
   
    "size":0,
    "aggregations":{
   
        # total_num:统计结果总数,precision_threshold:精确度默认为100,值越大精确度越大,但消耗内存也越大
        "total_num":{
   
            "cardinality":{
   
                "field":"product_name",
                "precision_threshold":100
            }
        },
        "product_name":{
   
            "terms":{
   
                "field":"product_name",
                # size:terms聚合中如果想根据全量数据排序,size需要设置为Integer的最大值
                "size":2147483647,
                "min_doc_count":1,
                "shard_min_doc_count":0,
                "show_term_doc_count_error":false,
                "execution_hint":"map",
                "order":[
                    {
   
                        "_count":"desc"
                    },
                    {
   
                        "_key":"asc"
                    }
                ],
                 # collect_mode:遍历方法设置为广度优先遍历,效率较深度优先遍历高
                "collect_mode":"breadth_first"
            },
            "aggregations":{
   
                "material_estimate_exposure":{
   
                    "sum":{
   
                        "field":"goods_material_estimate_exposure"
                    }
                },
                # bucket_sort:设置桶排序,同时对排序后的全量数据通过from、 size取分页数据
                "score_bucket_sort":{
   
                    "bucket_sort":{
   
                        "sort":[
                            {
   
                                # 按照聚合树中某一聚合项进行排序
                                "material_estimate_exposure":{
   
                                    "order":"desc"
                                }
                            }
                        ],
                        "from":0,
                        "size":50,
                        "gap_policy":"SKIP"
Elasticsearch 中,可以使用聚合(Aggregation)实现对文档进行聚合统计,其中包括出现次数的统计。下面是一个示例: 假设我们有一个名为 "sales" 的索引,包含以下文档: ``` { "product": "A", "price": 10.0, "timestamp": "2021-08-01T10:00:00Z" } { "product": "B", "price": 15.0, "timestamp": "2021-08-01T10:05:00Z" } { "product": "A", "price": 12.0, "timestamp": "2021-08-01T10:10:00Z" } { "product": "C", "price": 20.0, "timestamp": "2021-08-01T10:15:00Z" } { "product": "A", "price": 8.0, "timestamp": "2021-08-01T10:20:00Z" } { "product": "B", "price": 18.0, "timestamp": "2021-08-01T10:25:00Z" } ``` 现在,我们想要统计每个产品出现的次数,可以使用以下聚合查询: ``` { "aggs": { "products": { "terms": { "field": "product" } } } } ``` 其中,"aggs" 是聚合查询的关键字,"products" 是我们给这个聚合起的名字,"terms" 表示我们要按照某个字段进行分组,"field" 指定了我们要按照哪个字段进行分组。 运行上述查询后,得到的结果如下: ``` { "aggregations": { "products": { "buckets": [ { "key": "A", "doc_count": 3 }, { "key": "B", "doc_count": 2 }, { "key": "C", "doc_count": 1 } ] } } } ``` 其中,"key" 表示产品名称,"doc_count" 表示该产品出现的次数。 如果想要对出现次数进行排序,可以使用以下聚合查询: ``` { "aggs": { "products": { "terms": { "field": "product", "order": { "_count": "desc" } } } } } ``` 其中,"order" 表示按照什么字段进行排序,"_count" 表示按照出现次数进行排序,"desc" 表示降序排列。 运行上述查询后,得到的结果如下: ``` { "aggregations": { "products": { "buckets": [ { "key": "A", "doc_count": 3 }, { "key": "B", "doc_count": 2 }, { "key": "C", "doc_count": 1 } ] } } } ``` 其中,产品 A 出现的次数最多,排在第一位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值