聚合框架收集搜索查詢選擇的所有數(shù)據(jù),并由許多構(gòu)建塊組成,這有助于構(gòu)建數(shù)據(jù)的復(fù)雜摘要。聚合的基本結(jié)構(gòu)如下所示-
"aggregations" : { "" : { "" : { } [,"meta" : { [] } ]? [,"aggregations" : { []+ } ]? } [,"" : { ... } ]* }
聚合有不同的類型,每種類型都有自己的目的。本章將詳細(xì)討論這些問題。
這些聚合有助于根據(jù)聚合文檔的字段值計(jì)算矩陣,有時(shí)還可以從腳本生成一些值。
數(shù)值矩陣既可以是單值(如平均聚合),也可以是多值(如統(tǒng)計(jì)數(shù)據(jù))。
此聚合用于獲取聚合文檔中存在的任何數(shù)字字段的平均值。例如,
POST /schools/_search { "aggs":{ "avg_fees":{"avg":{"field":"fees"}} } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 41, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "schools", "_type" : "school", "_id" : "5", "_score" : 1.0, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }, { "_index" : "schools", "_type" : "school", "_id" : "4", "_score" : 1.0, "_source" : { "name" : "City Best School", "description" : "ICSE", "street" : "West End", "city" : "Meerut", "state" : "UP", "zip" : "250002", "location" : [ 28.9926174, 77.692485 ], "fees" : 3500, "tags" : [ "fully computerized" ], "rating" : "4.5" } } ] }, "aggregations" : { "avg_fees" : { "value" : 2850.0 } } }
此聚合提供了特定字段的不同值的計(jì)數(shù)。
POST /schools/_search?size=0 { "aggs":{ "distinct_name_count":{"cardinality":{"field":"fees"}} } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "distinct_name_count" : { "value" : 2 } } }
Note ?基數(shù)的值為2,因?yàn)橘M(fèi)用有兩個(gè)不同的值。
此聚合將生成有關(guān)聚合文檔中特定數(shù)字字段的所有統(tǒng)計(jì)信息。
POST /schools/_search?size=0 { "aggs" : { "fees_stats" : { "extended_stats" : { "field" : "fees" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "fees_stats" : { "count" : 2, "min" : 2200.0, "max" : 3500.0, "avg" : 2850.0, "sum" : 5700.0, "sum_of_squares" : 1.709E7, "variance" : 422500.0, "std_deviation" : 650.0, "std_deviation_bounds" : { "upper" : 4150.0, "lower" : 1550.0 } } } }
此聚合查找聚合文檔中特定數(shù)字字段的最大值。
POST /schools/_search?size=0 { "aggs" : { "max_fees" : { "max" : { "field" : "fees" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 16, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "max_fees" : { "value" : 3500.0 } } }
此聚合在聚合的文檔中查找特定數(shù)字字段的最小值。
POST /schools/_search?size=0 { "aggs" : { "min_fees" : { "min" : { "field" : "fees" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "min_fees" : { "value" : 2200.0 } } }
此聚合計(jì)算聚合文檔中特定數(shù)值字段的和。
POST /schools/_search?size=0 { "aggs" : { "total_fees" : { "sum" : { "field" : "fees" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "total_fees" : { "value" : 5700.0 } } }
在特殊情況下還有其他一些度量標(biāo)準(zhǔn)聚合,例如地理邊界聚合和地理質(zhì)心聚合,以實(shí)現(xiàn)地理位置。
一種多值度量標(biāo)準(zhǔn)聚合,可根據(jù)從聚合文檔中提取的數(shù)值來(lái)計(jì)算統(tǒng)計(jì)信息。
POST /schools/_search?size=0 { "aggs" : { "grades_stats" : { "stats" : { "field" : "fees" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "grades_stats" : { "count" : 2, "min" : 2200.0, "max" : 3500.0, "avg" : 2850.0, "sum" : 5700.0 } } }
您可以在請(qǐng)求時(shí)使用meta標(biāo)記添加一些有關(guān)聚合的數(shù)據(jù),并作為響應(yīng)獲取。
POST /schools/_search?size=0 { "aggs" : { "min_fees" : { "avg" : { "field" : "fees" } , "meta" :{ "dsc" :"Lowest Fees This Year" } } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "took" : 0, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "min_fees" : { "meta" : { "dsc" : "Lowest Fees This Year" }, "value" : 2850.0 } } }