1. 程式人生 > >Elasticsearch聚合 之 Range區間聚合

Elasticsearch聚合 之 Range區間聚合

Elasticsearch提供了多種聚合方式,能幫助使用者快速的進行資訊統計與分類,本篇主要講解下如何使用Range區間聚合。

最簡單的例子,想要統計一個班級考試60分以下、60到80分、80到100分,在ES中只要一個命令就可以輕鬆統計....

聚合例子

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

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