Elasticsearch聚合 之 Range区间聚合

来源:互联网 发布:瓦尔特磨床编程难吗 编辑:程序博客网 时间:2024/05/16 10:43

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":{}                }            }        }    }}

0 0