您好,登錄后才能下訂單哦!
本篇內容介紹了“Elasticsearch聚合的方法怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
聚合是一種基于搜索的數據匯總,通過組合可以完成復雜的操作。聚合可以對文檔進行匯總、分組等。通過聚合,我們會得到一個數據的概覽,是分析和總結一律的數據,而不是尋覓單個文檔。
Bucket Aggregation:少量列滿足特定條件的文檔的集合,相似MySQL的“group by”
Metric Aggregation:少量數學運算,可以對文檔字段進行統計分析,比方max、min、sum等。
Pipeline Aggregation:對其余的聚合結果進行二次聚合
Matrix Aggregation:支持對多個字段的操作并提供一個結果矩陣,7.x版本合并到Metric Aggregation中了。
{ "size": 0, ["query": {}, ]? "aggs" : { "${my_name}" : { "${aggregation_type}" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggs" : { [<sub_aggregation>]+ } ]? } [,"${my_name}" : { ... } ]* }}
聚合可以進行嵌套,比方上面的“aggs”內部又嵌套了一個“aggs”
“aggs”是簡寫,也可以寫完整“aggregations”
最上面的“size”一般設置為0,聚合操作用于統計數據,無需輸出文檔
query 查詢,可選
my_name 自己設置名字
使用kibana導入“kibana_sample_data_flights”,這個是飛機的航班信息,有地區、價格、天氣等信息。
操作路徑:Home --> 增加數據 --> 樣例數據 --> Sample flight data
根據目的地(DestCountry)進行分組,查看航班的數量
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" } } }}
根據價格區間進行分組,比方0到100元多少個,100到200元多少個
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”。
支持的時間間隔表達式
分鐘:minute, 1m
小時:hour, 1h
天:day, 1d
星期:week, 1w
月:month, 1M
季度:quarter, 1q
年:year, 1y
計算度量這類的聚合操作是以使用一種方式或者者從文檔中提取需要聚合的值為基礎的。這些數據不但可以從文檔(使用數據屬性)的屬性中提取出來,也可以使用腳本生成。
支持max、min、count、sum、avg、stats(各種統計信息)、cardinality(去重后數量)、percentiles(百分位)、geo_bounds(地理邊界)
輸出航班的最大價格,最小價格
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,會在內存中預先加載這些數據。
對聚合分析的結果再次做聚合分析。
分兩類
Sibling:結果和現有分析結果同級。有min_bucket、max_bucket、avg_bucket、sum_bucket、stats_bucket、percentiles_bucket
Parent:結果內嵌到現有的聚合分析結果之中。有derivative(差值,與前一個的差值,用于看趨勢)、cumulative_sum(累計求和)、moving_avg(移動平均,數據在一個固定大小窗口里的平均值)
說明,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,可以多看到兩個返回值。
doc_count_error_upper_bound:被遺漏的term 分桶,包含的文檔,有可能的最大值
sum_other_doc_count:除了返回結果 bucket的 terms 以外,其余 terms 的文檔總數(總數-返回的總數)
Trems 不正確的案例
那么如何處理呢?
處理方案 1:當數據量不大時,設置 Primary Shard 為 1;實現精確性。
處理方案 2:在分布式數據上,設置 shard_size 參數,提高準確度。原理:每次從 Shard 上額外多獲取數據,提升精確率,但會降低響應時間。
shard_size 的默認大小 “shard_size = size * 1.5 * 10”,可以根據自己的需要進行設置。
“Elasticsearch聚合的方法怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。