Elasticsearch聚合 之 Range区间聚合

 

Elasticsearch提供了多种聚合方式,能帮助用户快速的进行信息统计与分类,本篇主要讲解下如何使用Range区间聚合。

最简单的例子,想要统计一个班级考试60分以下、60到80分、80到100分,在ES中只要一个命令就可以轻松统计....

更多资料参考:Elasticsearch文档翻译

聚合例子

按照前言中的例子,可以执行下面的命令:

复制代码
{
    "aggs":{
        "grade_ranges":{
            "range":{
                "field":"grade",
                "ranges":[
                    {"to":60},
                    {"from":60,"to":80},
                    {"from":80}]
                }
            }
        }
}
复制代码

得到如下的结果:

复制代码
{
    ...
    "aggregations":{
        "price_ranges":{
            "buckets":[
                {
                    "to":60,
                    "doc_count":2
                },
                {
                    "from":60,
                    "to":80,
                    "doc_count":32
                },
                {
                    "from":80,
                    "doc_count":14
                }
            ]
        }
    }
}
复制代码

复杂点的例子,指定每个区间的名字

可以通过设置keyed:true,使每个区间都返回一个特定的名字:

复制代码
{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "keyed":true,
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            }
        }
    }
}
复制代码

默认会按照区间命名:

复制代码
{
    ...
    "aggregations":{
        "price_ranges":{
            "buckets":{
                "*-50.0":{
                    "to":50,
                    "doc_count":2
                },
                "50.0-100.0":{
                    "from":50,
                    "to":100,
                    "doc_count":4
                },
                "100.0-*":{
                    "from":100,
                    "doc_count":4
                }
            }
        }
    }
}
复制代码

当然也可以指定区间的名字:

复制代码
{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "keyed":true,
                "ranges":[
                    {"key":"cheap","to":50},
                    {"key":"average","from":50,"to":100},
                    {"key":"expensive","from":100}
                ]
            }
        }
    }
}
复制代码

使用脚本

与其他的聚合类似,Range聚合支持脚本的使用:

复制代码
{
    "aggs":{
        "price_ranges":{
            "range":{
                "script":"doc['price'].value",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            }
        }
    }
}
复制代码

文件脚本或者脚本值的操作都与其他的差不多,就不再赘述了。

聚合嵌套

通常在区间聚合中,都会嵌套子聚合,比如我们在每个区间中做统计stats聚合:

复制代码
{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]},
                "aggs":{
                    "price_stats":{
                        "stats":{
                            "field":"price"
                        }
                    }
                }
            }
        }
    }
复制代码

那么得到的结果会如下所示:

复制代码
{
    "aggregations":{
        "price_ranges":{
            "buckets":[
                {
                    "to":50,
                    "doc_count":2,
                    "price_stats":{
                        "count":2,
                        "min":20,
                        "max":47,
                        "avg":33.5,
                        "sum":67
                    }
                },
                {
                    "from":50,
                    "to":100,
                    "doc_count":4,
                    "price_stats":{
                        "count":4,
                        "min":60,
                        "max":98,
                        "avg":82.5,
                        "sum":330
                    }
                },
                {
                    "from":100,
                    "doc_count":4,
                    "price_stats":{
                        "count":4,
                        "min":134,
                        "max":367,
                        "avg":216,
                        "sum":864
                    }
                }
            ]
        }
    }
}
复制代码

如果不指定聚合的字段,那么默认会按照Range聚合的字段来做统计:

复制代码
{
    "aggs":{
        "price_ranges":{
            "range":{
                "field":"price",
                "ranges":[
                    {"to":50},
                    {"from":50,"to":100},
                    {"from":100}
                ]
            },
            "aggs":{
                "price_stats":{
                    "stats":{}
                }
            }
        }
    }
}
复制代码

 

posted @   xingoo  阅读(18611)  评论(4编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2014-11-12 【插件开发】—— 5 SWT控件以及布局使用
2013-11-12 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>
点击右上角即可分享
微信分享提示