Elasticsearch聚合的方法怎么用

本篇內(nèi)容介紹了“Elasticsearch聚合的方法怎么用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在光山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站制作,光山網(wǎng)站建設(shè)費(fèi)用合理。

一、前言

聚合是一種基于搜索的數(shù)據(jù)匯總,通過組合可以完成復(fù)雜的操作。聚合可以對(duì)文檔進(jìn)行匯總、分組等。通過聚合,我們會(huì)得到一個(gè)數(shù)據(jù)的概覽,是分析和總結(jié)一律的數(shù)據(jù),而不是尋覓單個(gè)文檔。

二、分類

  • Bucket Aggregation:少量列滿足特定條件的文檔的集合,相似MySQL的“group by”

  • Metric Aggregation:少量數(shù)學(xué)運(yùn)算,可以對(duì)文檔字段進(jìn)行統(tǒng)計(jì)分析,比方max、min、sum等。

  • Pipeline Aggregation:對(duì)其余的聚合結(jié)果進(jìn)行二次聚合

  • Matrix Aggregation:支持對(duì)多個(gè)字段的操作并提供一個(gè)結(jié)果矩陣,7.x版本合并到Metric Aggregation中了。

三、聚合結(jié)構(gòu)

{    "size": 0,     ["query": {}, ]?    "aggs" : {        "${my_name}" : {            "${aggregation_type}" : {                <aggregation_body>            }            [,"meta" : {  [<meta_data_body>] } ]?            [,"aggs" : { [<sub_aggregation>]+ } ]?        }        [,"${my_name}" : { ... } ]*    }}
  • 聚合可以進(jìn)行嵌套,比方上面的“aggs”內(nèi)部又嵌套了一個(gè)“aggs”

  • “aggs”是簡寫,也可以寫完整“aggregations”

  • 最上面的“size”一般設(shè)置為0,聚合操作用于統(tǒng)計(jì)數(shù)據(jù),無需輸出文檔

  • query 查詢,可選

  • my_name 自己設(shè)置名字

四、測試數(shù)據(jù)

使用kibana導(dǎo)入“kibana_sample_data_flights”,這個(gè)是飛機(jī)的航班信息,有地區(qū)、價(jià)格、天氣等信息。

操作路徑:Home --> 增加數(shù)據(jù) --> 樣例數(shù)據(jù) --> Sample flight data

五、Bucket Aggregation

1、子聚合

根據(jù)目的地(DestCountry)進(jìn)行分組,查看航班的數(shù)量

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "dest_count": {      "terms": {        "field": "DestCountry"      }    }  }}

2、數(shù)字區(qū)間分組

根據(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

3、日期區(qū)間分組

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

六、Metric Aggregation

計(jì)算度量這類的聚合操作是以使用一種方式或者者從文檔中提取需要聚合的值為基礎(chǔ)的。這些數(shù)據(jù)不但可以從文檔(使用數(shù)據(jù)屬性)的屬性中提取出來,也可以使用腳本生成。

支持max、min、count、sum、avg、stats(各種統(tǒng)計(jì)信息)、cardinality(去重后數(shù)量)、percentiles(百分位)、geo_bounds(地理邊界)

1、最值

輸出航班的最大價(jià)格,最小價(jià)格

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "max_price": {      "max": {        "field": "AvgTicketPrice"      }    },    "mix_price": {      "min": {        "field": "AvgTicketPrice"      }    }  }}

2、嵌套操作

輸出各個(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"          }        }      }    }  }}

3、stats

一次性輸出各種統(tǒng)計(jì)結(jié)果,包括count、min、max、sum、avg

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "my_stats":{      "stats": {        "field": "AvgTicketPrice"      }    }  }}

4、cardinality

去重后數(shù)量統(tǒng)計(jì)

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "my_cardinality":{      "cardinality": {        "field": "DestCountry"      }    }  }}

5、top_hits

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"                }              }            ]          }        }      }    }  }}

6、ranges 自己設(shè)置范圍分組

比方下面,小于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          }        ]      }    }  }}

7、百分位聚合

百分位聚合,可以利用百分位聚合的結(jié)果評(píng)估數(shù)據(jù)分布,判斷數(shù)據(jù)能否扭曲,判斷數(shù)據(jù)能否雙峰分布等。壓測的時(shí)候經(jīng)常使用,比方95百分位對(duì)應(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        ]      }    }  }}

8、地理邊界聚合

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_geo_bounds": {      "geo_bounds": {        "field": "DestLocation",        "wrap_longitude": true      }    }  }}

9、優(yōu)化 Terms 聚合的性能

設(shè)置 eager_global_ordinals 為true,會(huì)在內(nèi)存中預(yù)先加載這些數(shù)據(jù)。

七、Pipeline Aggregation

對(duì)聚合分析的結(jié)果再次做聚合分析。

分兩類

  • Sibling:結(jié)果和現(xiàn)有分析結(jié)果同級(jí)。有min_bucket、max_bucket、avg_bucket、sum_bucket、stats_bucket、percentiles_bucket

  • Parent:結(jié)果內(nèi)嵌到現(xiàn)有的聚合分析結(jié)果之中。有derivative(差值,與前一個(gè)的差值,用于看趨勢(shì))、cumulative_sum(累計(jì)求和)、moving_avg(移動(dòng)平均,數(shù)據(jù)在一個(gè)固定大小窗口里的平均值)

說明,bucket_path參數(shù),指定路徑,假如是二級(jí)路徑,注意有一個(gè)“>”。

1、Sibling的例子

根據(jù)不同的目的地獲取平均票據(jù),并對(duì)這些平均票價(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"      }    }  }}

2、Parent的例子

統(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"          }        }      }    }  }}

九、聚合分析的原理及精準(zhǔn)度問題

Elasticsearch聚合的方法怎么用

聚合分析

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ù))

Elasticsearch聚合的方法怎么用

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ù),提升精確率,但會(huì)降低響應(yīng)時(shí)間。

shard_size 的默認(rèn)大小 “shard_size = size * 1.5 * 10”,可以根據(jù)自己的需要進(jìn)行設(shè)置。

“Elasticsearch聚合的方法怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站標(biāo)題:Elasticsearch聚合的方法怎么用
分享地址:http://muchs.cn/article22/gphscc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、軟件開發(fā)自適應(yīng)網(wǎng)站外貿(mào)建站、網(wǎng)站策劃、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)