• 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":{}
                    }
                }
            }
        }
    }
  • 相关阅读:
    C# 获取程序当前路径
    主线程等待子线程执行二
    ADO.NET Entity Framework Code Fisrt 开篇(一)
    解决Eclipse java was started but returned exit code = 1问题
    windows 下YII框架初试
    hadoop的partitioner
    YII 学习一: YII 初试
    linux 文件大小ll和du不一致问题
    [转载]PyDev for Eclipse 简介
    python 常用代码学习笔记之commands模块
  • 原文地址:https://www.cnblogs.com/xing901022/p/4960451.html
Copyright © 2020-2023  润新知