聚合是一种基于搜索的数据汇总,经过组合能够完成复杂的操做。聚合能够对文档进行汇总、分组等。经过聚合,咱们会获得一个数据的概览,是分析和总结所有的数据,而不是寻找单个文档。html
{ "size": 0, ["query": {}, ]? "aggs" : { "${my_name}" : { "${aggregation_type}" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggs" : { [<sub_aggregation>]+ } ]? } [,"${my_name}" : { ... } ]* } }
使用kibana导入“kibana_sample_data_flights”,这个是飞机的航班信息,有地区、价格、天气等信息。git
操做路径:Home --> 添加数据 --> 样例数据 --> Sample flight dataelasticsearch
根据目的地(DestCountry)进行分组,查看航班的数量分布式
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" } } } }
根据价格区间进行分组,好比0到100元多少个,100到200元多少个ide
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { // 自定义名字 "histogram": { "field": "AvgTicketPrice", "interval": 100 // 指定区间 } } } }
输出的结果中,key为“100.0”表明0到100.0的数据,计算公式以下性能
bucket_key = Math.floor(value / interval) * interval
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { "date_histogram": { "field": "timestamp", "calendar_interval": "month" } } } }
注意:日期间隔设置,7.x版本用“calendar_interval”,老版本用“interval”。测试
支持的时间间隔表达式优化
计算度量这类的聚合操做是以使用一种方式或者从文档中提取须要聚合的值为基础的。这些数据不但能够从文档(使用数据属性)的属性中提取出来,也可使用脚本生成。ui
支持max、min、count、sum、avg、stats(各类统计信息)、cardinality(去重后数量)、percentiles(百分位)、geo_bounds(地理边界)code
输出航班的最大价格,最小价格
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "mix_price": { "min": { "field": "AvgTicketPrice" } } } }
输出各个目的地航班的最大价格,最小价格
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count":{ "terms": { "field": "DestCountry" }, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "min_price": { "min": { "field": "AvgTicketPrice" } } } } } }
一次性输出各类统计结果,包括count、min、max、sum、avg
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_stats":{ "stats": { "field": "AvgTicketPrice" } } } }
去重后数量统计
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_cardinality":{ "cardinality": { "field": "DestCountry" } } } }
top_hits 操做,最开头的几个文档。
获取去每一个国家的航班的最小价格,下面的“"size": 5”表明获取5个国家的航班,“"size": 2”表明最低的2个价格。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_count": { "terms": { "field": "DestCountry", "size": 5 }, "aggs": { "my_min_price": { "top_hits": { "size": 2, "sort": [ { "AvgTicketPrice": { "order": "asc" } } ] } } } } } }
好比下面,小于200一个分组,200到500一个分组,大于500个分组,能够指定输出的key。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_range":{ "range": { "field": "AvgTicketPrice", "ranges": [ { "to": 200 }, { "from": 200, "to": 500 }, { "key": ">500", "from": 500 } ] } } } }
百分位聚合,能够利用百分位聚合的结果评估数据分布,判断数据是否扭曲,判断数据是否双峰分布等。压测的时候常用,好比95百分位对应的值表示这个值大于95%的全部值。假设结果是“10%:12ms ,..., 70%:55ms, 99%:100ms”,说明一般状况下(70%),网页的响应时间在12ms~55ms,99%的网页在100ms内加载完成。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_percentiles":{ "percentiles": { "field": "AvgTicketPrice", "percents": [ 1, 5, 25, 50, 75, 95, 99 ] } } } }
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_geo_bounds": { "geo_bounds": { "field": "DestLocation", "wrap_longitude": true } } } }
设置 eager_global_ordinals 为true,会在内存中预先加载这些数据。
对聚合分析的结果再次作聚合分析。
分两类
说明,bucket_path参数,指定路径,若是是二级路径,注意有一个“>”。
根据不一样的目的地获取平均票据,并对这些平均票价作分析。
注意,my_distance
,my_avg_price
,my_result
这三个是自定义的变量名,buckets_path指定路径。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "terms": { "field": "DestCountry" }, "aggs": { "my_avg_price": { "avg": { "field": "AvgTicketPrice" } } } }, "my_result": { "stats_bucket": { "buckets_path": "my_distance>my_avg_price" } } } }
统计每50km的平均票价,并查看其波动
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "histogram": { "field": "DistanceKilometers", "interval": 50 }, "aggs": { "my_avg_price": { "avg": { "field": "AvgTicketPrice" } }, "my_result": { "derivative": { "buckets_path": "my_avg_price" } } } } } }
根据数量(_count)进行排序,数量相同根据返回的key进行排序
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry", "order": [ { "_count": "asc" }, { "_key": "desc" } ] } } } }
根据最终返回的结果进行排序,好比下面的my_stats
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "terms": { "field": "DestCountry", "order": { "my_stats.min": "asc" } }, "aggs": { "my_stats": { "stats": { "field": "AvgTicketPrice" } } } } } }
Terms 聚合分析不许的缘由,数据分散在多个分片上,Coordinating Node 没法获取数据全貌。
打开 show_term_doc_count_error,能够多看到两个返回值。
那么如何解决呢?
shard_size 的默认大小 “shard_size = size * 1.5 * 10”,能够根据本身的须要进行设置。