本篇內(nèi)容介紹了“Elasticsearch聚合的方法怎么用”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。聚合是一種基于搜索的數(shù)據(jù)匯總,通過組合可以完成復(fù)雜的操作。聚合可以對文檔進(jìn)行匯總、分組等。通過聚合,我們會得到一個(gè)數(shù)據(jù)的概覽,是分析和總結(jié)一律的數(shù)據(jù),而不是尋覓單個(gè)文檔。
Bucket Aggregation:少量列滿足特定條件的文檔的集合,相似MySQL的“group by”
Metric Aggregation:少量數(shù)學(xué)運(yùn)算,可以對文檔字段進(jìn)行統(tǒng)計(jì)分析,比方max、min、sum等。
Pipeline Aggregation:對其余的聚合結(jié)果進(jìn)行二次聚合
Matrix Aggregation:支持對多個(gè)字段的操作并提供一個(gè)結(jié)果矩陣,7.x版本合并到Metric Aggregation中了。
{ "size": 0, ["query": {}, ]? "aggs" : { "${my_name}" : { "${aggregation_type}" : {} [,"meta" : { [ ] } ]? [,"aggs" : { [ ]+ } ]? } [,"${my_name}" : { ... } ]* }}
聚合可以進(jìn)行嵌套,比方上面的“aggs”內(nèi)部又嵌套了一個(gè)“aggs”
“aggs”是簡寫,也可以寫完整“aggregations”
最上面的“size”一般設(shè)置為0,聚合操作用于統(tǒng)計(jì)數(shù)據(jù),無需輸出文檔
query 查詢,可選
my_name 自己設(shè)置名字
使用kibana導(dǎo)入“kibana_sample_data_flights”,這個(gè)是飛機(jī)的航班信息,有地區(qū)、價(jià)格、天氣等信息。
操作路徑:Home --> 增加數(shù)據(jù) --> 樣例數(shù)據(jù) --> Sample flight data
根據(jù)目的地(DestCountry)進(jìn)行分組,查看航班的數(shù)量
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" } } }}
根據(jù)價(jià)格區(qū)間進(jìn)行分組,比方0到100元多少個(gè),100到200元多少個(gè)
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "price_stat": { // 自己設(shè)置名字 "histogram": { "field": "AvgTicketPrice", "interval": 100 // 指定區(qū)間 } } }}
輸出的結(jié)果中,key為“100.0”代表0到100.0的數(shù)據(jù),計(jì)算公式如下
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" } } }}
注意:日期間隔設(shè)置,7.x版本用“calendar_interval”,老版本用“interval”。
支持的時(shí)間間隔表達(dá)式
分鐘:minute, 1m
小時(shí):hour, 1h
天:day, 1d
星期:week, 1w
月:month, 1M
季度:quarter, 1q
年:year, 1y
計(jì)算度量這類的聚合操作是以使用一種方式或者者從文檔中提取需要聚合的值為基礎(chǔ)的。這些數(shù)據(jù)不但可以從文檔(使用數(shù)據(jù)屬性)的屬性中提取出來,也可以使用腳本生成。
支持max、min、count、sum、avg、stats(各種統(tǒng)計(jì)信息)、cardinality(去重后數(shù)量)、percentiles(百分位)、geo_bounds(地理邊界)
輸出航班的大價(jià)格,最小價(jià)格
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "mix_price": { "min": { "field": "AvgTicketPrice" } } }}
輸出各個(gè)目的地航班的大價(jià)格,最小價(jià)格
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" } } } } }}
一次性輸出各種統(tǒng)計(jì)結(jié)果,包括count、min、max、sum、avg
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "my_stats":{ "stats": { "field": "AvgTicketPrice" } } }}
去重后數(shù)量統(tǒng)計(jì)
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "my_cardinality":{ "cardinality": { "field": "DestCountry" } } }}
top_hits 操作,最開頭的幾個(gè)文檔。
獲取去每個(gè)國家的航班的最小價(jià)格,下面的“"size": 5”代表獲取5個(gè)國家的航班,“"size": 2”代表最低的2個(gè)價(jià)格。
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一個(gè)分組,200到500一個(gè)分組,大于500個(gè)分組,可以指定輸出的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 } ] } } }}
百分位聚合,可以利用百分位聚合的結(jié)果評估數(shù)據(jù)分布,判斷數(shù)據(jù)能否扭曲,判斷數(shù)據(jù)能否雙峰分布等。壓測的時(shí)候經(jīng)常使用,比方95百分位對應(yīng)的值表示這個(gè)值大于95%的所有值。假設(shè)結(jié)果是“10%:12ms ,..., 70%:55ms, 99%:100ms”,說明通常情況下(70%),網(wǎng)頁的響應(yīng)時(shí)間在12ms~55ms,99%的網(wǎng)頁在100ms內(nèi)加載完成。
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 } } }}
設(shè)置 eager_global_ordinals 為true,會在內(nèi)存中預(yù)先加載這些數(shù)據(jù)。
對聚合分析的結(jié)果再次做聚合分析。
分兩類
Sibling:結(jié)果和現(xiàn)有分析結(jié)果同級。有min_bucket、max_bucket、avg_bucket、sum_bucket、stats_bucket、percentiles_bucket
Parent:結(jié)果內(nèi)嵌到現(xiàn)有的聚合分析結(jié)果之中。有derivative(差值,與前一個(gè)的差值,用于看趨勢)、cumulative_sum(累計(jì)求和)、moving_avg(移動(dòng)平均,數(shù)據(jù)在一個(gè)固定大小窗口里的平均值)
說明,bucket_path參數(shù),指定路徑,假如是二級路徑,注意有一個(gè)“>”。
根據(jù)不同的目的地獲取平均票據(jù),并對這些平均票價(jià)做分析。
注意,my_distance
,my_avg_price
,my_result
這三個(gè)是自己設(shè)置的變量名,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" } } }}
統(tǒng)計(jì)每50km的平均票價(jià),并查看其波動(dòng)
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" } } } } }}
根據(jù)數(shù)量(_count)進(jìn)行排序,數(shù)量相同根據(jù)返回的key進(jìn)行排序
GET kibana_sample_data_flights/_search{ "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry", "order": [ { "_count": "asc" }, { "_key": "desc" } ] } } }}
根據(jù)最終返回的結(jié)果進(jìn)行排序,比方下面的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 聚合分析不準(zhǔn)的起因,數(shù)據(jù)分散在多個(gè)分片上,Coordinating Node 無法獲取數(shù)據(jù)全貌。
打開 show_term_doc_count_error,可以多看到兩個(gè)返回值。
doc_count_error_upper_bound:被遺漏的term 分桶,包含的文檔,有可能的大值
sum_other_doc_count:除了返回結(jié)果 bucket的 terms 以外,其余 terms 的文檔總數(shù)(總數(shù)-返回的總數(shù))
Trems 不正確的案例
那么如何處理呢?
處理方案 1:當(dāng)數(shù)據(jù)量不大時(shí),設(shè)置 Primary Shard 為 1;實(shí)現(xiàn)精確性。
處理方案 2:在分布式數(shù)據(jù)上,設(shè)置 shard_size 參數(shù),提高準(zhǔn)確度。原理:每次從 Shard 上額外多獲取數(shù)據(jù),提升精確率,但會降低響應(yīng)時(shí)間。
shard_size 的默認(rèn)大小 “shard_size = size * 1.5 * 10”,可以根據(jù)自己的需要進(jìn)行設(shè)置。
“Elasticsearch聚合的方法怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!