日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch笔记(七):聚合查询

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch笔记(七):聚合查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聚合框架有助于根據搜索查詢提供聚合數據。聚合查詢是數據庫中重要的功能特性,ES作為搜索引擎兼數據庫,同樣提供了強大的聚合分析能力。它基于查詢條件來對數據進行分桶、計算的方法。有點類似于 SQL 中的 group by 再加一些函數方法的操作。聚合可以嵌套,由此可以組成復雜的操作(Bucketing聚合可以包含sub-aggregation)。

聚合計算的值可以取字段的值,也可是腳本計算的結果。查詢請求體中以aggregations節點的語法定義:?

"aggregations" : {? ? ? ? ? ? ? ? ? ? ? ? //也可簡寫為 aggs
? ? "<aggregation_name>" : {? ? ? //聚合的名字
? ? ? ? "<aggregation_type>" : {? ? ?//聚合的類型
? ? ? ? ? ? <aggregation_body>? ? ? //聚合體:對哪些字段進行聚合
? ? ? ? }
? ? ? ? [,"meta" : { ?[<meta_data_body>] } ]?? ? ? ? ? ? ? ? ?//元
? ? ? ? [,"aggregations" : { [<sub_aggregation>]+ } ]?? ?//在聚合里面在定義子聚合
? ? }
? ? [,"<aggregation_name_2>" : { ... } ]*? ? ? ? ? ? ? ? ? ? ? //聚合的名字
}

目錄

1.?指標聚合

1.1?max min sum avg

1.2?值統計

1.3?distinct 聚合

1.4?統計聚合

1.5 拓展的統計聚合

1.6?百分比統計

1.7 百分比排名聚合

1.8?Top Hits

1.9?Geo Bounds Aggregation

1.10?Geo Centroid Aggregation

2.?桶聚合

2.1?Terms Aggregation

2.2?filter Aggregation

2.3?Filters Aggregation

2.4?范圍聚合

2.5?時間范圍聚合

2.6??時間柱狀聚合

2.7?Missing Aggregation

2.8 IP范圍聚合

2.9?Nested Aggregation

3.?矩陣聚合

4.?管道聚合

4.1?Derivative Aggregation:parent

4.2?Moving Average Aggregation:parent

4.3?Bucket Script Aggregation:parent

4.4?Bucket Selector Aggregation:parent

4.5?Serial Differencing Aggregation:parent

4.6?Avg Max Min Sum:sibliing

4.7?Stats Bucket Aggregation:sibliing

4.8?Extended Stats Bucket Aggregation:sibliing

4.9?Percentiles Bucket Aggregation:sibliing


1.?指標聚合

Metrics Aggregations,指標聚合。

它是對文檔進行一些權值計算(比如求所有文檔某個字段求最大、最小、和、平均值),輸出結果往往是文檔的權值,相當于為文檔添加了一些統計信息。

它基于特定字段(field)或腳本值(generated using scripts),計算聚合中文檔的數值權值。數值權值聚合(注意分類只針對數值權值聚合,非數值的無此分類)輸出單個權值的,也叫?single-value numeric metrics,其它生成多個權值(比如:stats)的被叫做 multi-value numeric metrics。

1.1?max min sum avg

Max Aggregation,求最大值。基于文檔的某個值(可以是特定的數值型字段,也可以通過腳本計算而來),計算該值在聚合文檔中的均值。

Min Aggregation,求最小值。同上

Sum Aggregation,求和。同上

Avg Aggregation,求平均數。同上

POST /sales/_search?size=0
{
????"aggs" : {
????????"max_price" : { "max" : { "field" : "price" } }
????}
}
{//返回
? "took": 2080,
? "timed_out": false,
? "_shards": {
? ? "total": 5,
? ? "successful": 5,
? ? "skipped": 0,
? ? "failed": 0
? },
? "hits": {
? ? "total": 1000,
? ? "max_score": 0,
? ? "hits": []
? },
? "aggregations": {
? ? ? ? "max_price": {
? ? ? ? ? ? "value": 200.0
? ? ? ? }
? ? }
}
POST /sales/_search?size=0
{
? ? "aggs" : {
? ? ? ? "min_price" : { "min" : { "field" : "price" } }
? ? }
}
POST /sales/_search?size=0
{
? ? "query" : {
? ? ? ? "constant_score" : {
? ? ? ? ? ? "filter" : {
? ? ? ? ? ? ? ? "match" : { "type" : "hat" }
? ? ? ? ? ? }
? ? ? ? }
? ? },
? ? "aggs" : {
? ? ? ? "hat_prices" : { "sum" : { "field" : "price" } }
? ? }
}
POST /exams/_search?size=0
{
? ? "aggs" : {
? ? ? ? "avg_grade" : { "avg" : { "field" : "grade" } }
? ? }
}

1.2?值統計

Value Count Aggregation,值計數聚合。計算聚合文檔中某個值(可以是特定的數值型字段,也可以通過腳本計算而來)的個數。該聚合一般域其它 single-value?聚合聯合使用,比如在計算一個字段的平均值的時候,可能還會關注這個平均值是由多少個值計算而來。

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_count": {
? ? ? "value_count": {
? ? ? ? "field": "age"
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_count": {
? ? ? "value": 1000
? ? }
? }
}

1.3?distinct 聚合

Cardinality Aggregation,基數聚合。它屬于multi-value,基于文檔的某個值(可以是特定的字段,也可以通過腳本計算而來),計算文檔非重復的個數(去重計數),相當于sql中的distinct。

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_count": {
? ? ? "cardinality": {
? ? ? ? "field": "age"
? ? ? }
? ? },
? ? "state_count": {
? ? ? "cardinality": {
? ? ? ? "field": "state.keyword"
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "state_count": {
? ? ? "value": 51
? ? },
? ? "age_count": {
? ? ? "value": 21
? ? }
? }
}

1.4?統計聚合

Stats Aggregation,統計聚合。它屬于multi-value,基于文檔的某個值(可以是特定的數值型字段,也可以通過腳本計算而來),計算出一些統計信息(min、max、sum、count、avg5個值)。

POST /bank/_search?size=0
{
??"aggs": {
????"age_stats": {
??????"stats": {
????????"field": "age"
??????}
????}
??}
}
{//返回
? ? ...
??"aggregations": {
????"age_stats": {
??????"count": 1000,
??????"min": 20,
??????"max": 40,
??????"avg": 30.171,
??????"sum": 30171
????}
??}
}

1.5 拓展的統計聚合

Extended Stats Aggregation,擴展統計聚合。它屬于multi-value,比stats多4個統計結果: 平方和、方差、標準差、平均值加/減兩個標準差的區間

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_stats": {
? ? ? "extended_stats": {
? ? ? ? "field": "age"
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_stats": {
? ? ? "count": 1000,
? ? ? "min": 20,
? ? ? "max": 40,
? ? ? "avg": 30.171,
? ? ? "sum": 30171,
? ? ? "sum_of_squares": 946393,
? ? ? "variance": 36.10375899999996,
? ? ? "std_deviation": 6.008640362012022,
? ? ? "std_deviation_bounds": {
? ? ? ? "upper": 42.18828072402404,
? ? ? ? "lower": 18.153719275975956
? ? ? }
? ? }
? }
}

1.6?百分比統計

Percentiles Aggregation,百分比聚合。它屬于multi-value,對指定字段(腳本)的值按從小到大累計每個值對應的文檔數的占比(占所有命中文檔數的百分比),返回指定占比比例對應的值。默認返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值。

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_percents": {
? ? ? "percentiles": {
? ? ? ? "field": "age"
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_percents": {
? ? ? "values": {
? ? ? ? "1.0": 20,
? ? ? ? "5.0": 21,
? ? ? ? "25.0": 25,
? ? ? ? "50.0": 31,? ?//占比為50%的文檔的age值 <= 31,或反過來:age<=31的文檔數占總命中文檔數的50%
? ? ? ? "75.0": 35.00000000000001,
? ? ? ? "95.0": 39,
? ? ? ? "99.0": 40
? ? ? }
? ? }
? }
}

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_percents": {
? ? ? "percentiles": {
? ? ? ? "field": "age",
? ? ? ? "percents" : [95, 99, 99.9] ?? ?//指定分位值
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_percents": {
? ? ? "values": {
? ? ? ? "95.0": 39,
? ? ? ? "99.0": 40,
? ? ? ? "99.9": 40
? ? ? }
? ? }
? }
}

1.7 百分比排名聚合

Percentile Ranks Aggregation,統計年齡小于25和年齡小于30的文檔的占比,這里需求可以使用。

POST /bank/_search?size=0
{
? "aggs": {
? ? "gge_perc_rank": {
? ? ? "percentile_ranks": {
? ? ? ? "field": "age",
? ? ? ? "values": [
? ? ? ? ? 25,
? ? ? ? ? 30
? ? ? ? ]
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "gge_perc_rank": {
? ? ? "values": {? ?//年齡小于25的文檔占比為26.1%,年齡小于30的文檔占比為49.2%
? ? ? ? "25.0": 26.1,?
? ? ? ? "30.0": 49.2
? ? ? }
? ? }
? }
}

1.8?Top Hits

Top Hits Aggregation,最高匹配權值聚合。獲取到每組前n條數據,相當于sql 中Top(group by 后取出前n條)。它跟蹤聚合中相關性最高的文檔,該聚合一般用做 sub-aggregation,以此來聚合每個桶中的最高匹配的文檔,較為常用的統計。

GET index/type/_search?search_type=count
{
? "query": {
? ? "match_all": {}
? },
? "aggs": {
? ? "all_interests": {
? ? ? "terms": {
? ? ? ? "field": "zxw_id",
? ? ? ? "size": 100
? ? ? },
? ? ? "aggs": {
? ? ? ? "top_tag_hits": {
? ? ? ? ? "top_hits": {
? ? ? ? ? ? "size": 1? ??//返回的最大文檔個數(default 3)
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? }
? }
}

1.9?Geo Bounds Aggregation

Geo Bounds Aggregation,地理邊界聚合。基于文檔的某個字段(geo-point類型字段),計算出該字段所有地理坐標點的邊界(左上角/右下角坐標點)。

GET index/type/_search?search_type=count
{
? "query": {
? ? "match_all": {}
? },
? "aggs": {
? ? "viewport": {
? ? ? "geo_bounds": {
? ? ? ? "field": "location",
? ? ? ? "wrap_longitude": true //是否允許地理邊界與國際日界線存在重疊
? ? ? }
? ? }
? }
}
{//返回,
? ? ...
? ? "aggregations": {
? ? ? ? "viewport": {
? ? ? ? ? ? "bounds": {
? ? ? ? ? ? ? ? "top_left": { //這個矩形區域左上角坐標
? ? ? ? ? ? ? ? ? ? "lat": 80.45,
? ? ? ? ? ? ? ? ? ? "lon": -160.22
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "bottom_right": {//這個矩形區域右下角坐標
? ? ? ? ? ? ? ? ? ? "lat": 40.65,
? ? ? ? ? ? ? ? ? ? "lon": 42.57
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

1.10?Geo Centroid Aggregation

?Geo Centroid Aggregation,地理重心聚合。基于文檔的某個字段(geo-point類型字段),計算所有坐標的加權重心。

GET index/type/_search?search_type=count
{
? ? "query" : {
? ? ? ? "match" : { "crime" : "burglary" }
? ? },
? ? "aggs" : {
? ? ? ? "centroid" : {
? ? ? ? ? ? "geo_centroid" : {
? ? ? ? ? ? ? ? "field" : "location"?
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
{//輸出
? ? ...
? ? "aggregations": {
? ? ? ? "centroid": {
? ? ? ? ? ? "location": { ? ? ?//重心經緯度
? ? ? ? ? ? ? ? "lat": 80.45,
? ? ? ? ? ? ? ? "lon": -160.22
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

2.?桶聚合

Bucket Aggregations,桶聚合。

它執行的是對文檔分組的操作(與sql中的group by類似),把滿足相關特性的文檔分到一個桶里,即桶分,輸出結果往往是一個個包含多個文檔的桶(一個桶就是一個group)。

它有一個關鍵字(field、script),以及一些桶分(分組)的判斷條件。執行聚合操作時候,文檔會判斷每一個分組條件,如果滿足某個,該文檔就會被分為該組(fall in)。

它不進行權值的計算,他們對文檔根據聚合請求中提供的判斷條件(比如:{"from":0, ?"to":100})來進行分組(桶分)。桶聚合還會額外返回每一個桶內文檔的個數。

它可以包含子聚合——sub-aggregations(權值聚合不能包含子聚合,可以作為子聚合),子聚合操作將會應用到由父聚合產生的每一個桶上。

它根據聚合條件,可以只定義輸出一個桶;也可以輸出多個(multi-bucket);還可以在根據聚合條件動態確定桶個數(比如:terms aggregation)。

2.1?Terms Aggregation

Terms Aggregation,詞聚合。基于某個field,該 field 內的每一個【唯一詞元】為一個桶,并計算每個桶內文檔個數。默認返回順序是按照文檔個數多少排序。它屬于multi-bucket。當不返回所有 buckets 的情況(它size控制),文檔個數可能不準確。

POST /bank/_search?size=0
{
? ? "aggs" : {
? ? ? ? "age_terms" : {
? ? ? ? ? ? "terms" : {?
? ? ? ? ? ? ? "field" : "age",
? ? ? ? ? ? ? "size" : 10,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //size用來定義需要返回多個 buckets(防止太多),默認會全部返回。
? ? ? ? ? ? ? "order" : { "_count" : "asc" },? //根據文檔計數排序,根據分組值排序({ "_key" : "asc" })
? ? ? ? ? ? ? "min_doc_count": 10,? ? ? ? ? ? //只返回文檔個數不小于該值的 buckets
? ? ? ? ? ? ? "include" : ".*sport.*",? ? ? ? ? ? //包含過濾
? ? ? ? ? ? ? "exclude" : "water_.*",? ? ? ? ? //排除過濾
? ? ? ? ? ? ? "missing": "N/A"?
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_terms": {
? ? ? "terms": {
? ? ? ? "field": "age",
? ? ? ? "size": 5,
? ? ? ? "shard_size": 20,?//指定每個分片返回多少個分組,默認值(索引只有一個分片:= size,多分片:= size * 1.5 + 10)
? ? ? ? "show_term_doc_count_error": true ? ? ?//每個分組上顯示偏差值
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_terms": {
? ? ? "doc_count_error_upper_bound": 0, //文檔計數的最大偏差值
? ? ? "sum_other_doc_count": 463,? ? ? ? ? ?//未返回的其他項的文檔數
? ? ? "buckets": [? ? ? ? ? ? ? ? //默認情況下返回按文檔計數從高到低的前10個分組
? ? ? ? {
? ? ? ? ? "key": 31,? ? ? ? ? ? ? //年齡為31的文檔有61個
? ? ? ? ? "doc_count": 61
? ? ? ? },
? ? ? ? {
? ? ? ? ? "key": 39,? ? ? ? ? ? //年齡為39的文檔有60個
? ? ? ? ? "doc_count": 60
? ? ? ? },
? ? ? ? {
? ? ? ? ? "key": 34,
? ? ? ? ? "doc_count": 49
? ? ? ? }
? ? ? ]
? ? }
? }
}

2.2?filter Aggregation

Filter Aggregation,過濾聚合。基于一個條件,來對當前的文檔進行過濾的聚合。

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_terms": {
? ? ? "filter": {"match":{"gender":"F"}},
? ? ? "aggs": {
? ? ? ? "avg_age": {
? ? ? ? ? "avg": {
? ? ? ? ? ? "field": "age"
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_terms": {
? ? ? "doc_count": 493,
? ? ? "avg_age": {
? ? ? ? "value": 30.3184584178499
? ? ? }
? ? }
? }
}

2.3?Filters Aggregation

Filters Aggregation,多過濾聚合。基于多個過濾條件,來對當前文檔進行【過濾】的聚合,每個過濾都包含所有滿足它的文檔(多個bucket中可能重復),先過濾再聚合。它屬于multi-bucket。

GET logs/_search
{
? "size": 0,
? "aggs": {
? ? "messages": {
? ? ? "filters": {?//?配置過濾條件,支持 HASH 或 數組格式
? ? ? ? "filters": {
? ? ? ? ? "errors": {
? ? ? ? ? ? "match": {
? ? ? ? ? ? ? "body": "error"
? ? ? ? ? ? }
? ? ? ? ? },
? ? ? ? ? "warnings": {
? ? ? ? ? ? "match": {
? ? ? ? ? ? ? "body": "warning"
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "messages": {
? ? ? "buckets": {
? ? ? ? "errors": {
? ? ? ? ? "doc_count": 1
? ? ? ? },
? ? ? ? "warnings": {
? ? ? ? ? "doc_count": 2
? ? ? ? }
? ? ? }
? ? }
? }
}

2.4?范圍聚合

Range Aggregation,范圍分組聚合。基于某個值(可以是 field 或 script),以【字段范圍】來桶分聚合。范圍聚合包括 from 值,不包括 to 值(區間前閉后開)。它屬于multi-bucket。

POST /bank/_search?size=0
{
? "aggs": {
? ? "age_range": {
? ? ? "range": {
? ? ? ? "field": "age",
? ? ? ? "ranges": [ //配置區間
? ? ? ? ? {
? ? ? ? ? ? "to": 25
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "from": 25,
? ? ? ? ? ? "to": 35
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "from": 35
? ? ? ? ? }
? ? ? ? ]
? ? ? },
? ? ? "aggs": {
? ? ? ? "bmax": {
? ? ? ? ? "max": {
? ? ? ? ? ? "field": "balance"
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "age_range": {
? ? ? "buckets": [
? ? ? ? {
? ? ? ? ? "key": "*-25.0",
? ? ? ? ? "to": 25,
? ? ? ? ? "doc_count": 225,
? ? ? ? ? "bmax": {
? ? ? ? ? ? "value": 49587
? ? ? ? ? }
? ? ? ? },
? ? ? ? {
? ? ? ? ? "key": "25.0-35.0",
? ? ? ? ? "from": 25,
? ? ? ? ? "to": 35,
? ? ? ? ? "doc_count": 485,
? ? ? ? ? "bmax": {
? ? ? ? ? ? "value": 49795
? ? ? ? ? }
? ? ? ? },
? ? ? ? {
? ? ? ? ? "key": "35.0-*",
? ? ? ? ? "from": 35,
? ? ? ? ? "doc_count": 290,
? ? ? ? ? "bmax": {
? ? ? ? ? ? "value": 49989
? ? ? ? ? }
? ? ? ? }
? ? ? ]
? ? }
? }
}

2.5?時間范圍聚合

Date Range Aggregation,日期范圍聚合。基于日期類型的值,以【日期范圍】來桶分聚合。期范圍可以用各種?Date Math?表達式。同樣的,包括 from 的值,不包括 to 的值。它屬于multi-bucket。

POST /bank/_search?size=0
{
? "aggs": {
? ? "range": {
? ? ? "date_range": {
? ? ? ? "field": "date",
? ? ? ? "format": "MM-yyy",
? ? ? ? "ranges": [? ?//包含2個桶
? ? ? ? ? {
? ? ? ? ? ? "to": "now-10M/M"
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? "from": "now-10M/M"
? ? ? ? ? }
? ? ? ? ]
? ? ? }
? ? }
? }
}
{//返回
? ? ...
? "aggregations": {
? ? "range": {
? ? ? "buckets": [
? ? ? ? {
? ? ? ? ? "key": "*-2017-08-01T00:00:00.000Z",
? ? ? ? ? "to": 1501545600000,
? ? ? ? ? "to_as_string": "2017-08-01T00:00:00.000Z",
? ? ? ? ? "doc_count": 0
? ? ? ? },
? ? ? ? {
? ? ? ? ? "key": "2017-08-01T00:00:00.000Z-*",
? ? ? ? ? "from": 1501545600000,
? ? ? ? ? "from_as_string": "2017-08-01T00:00:00.000Z",
? ? ? ? ? "doc_count": 0
? ? ? ? }
? ? ? ]
? ? }
? }
}

2.6??時間柱狀聚合

你要先了解下Histogram Aggregation,直方圖聚合。基于文檔中的某個【數值類型】字段,通過計算來動態的分桶。它屬于multi-bucket。

{
? ? "aggs" : {
? ? ? ? "prices" : {
? ? ? ? ? ? "histogram" : {
? ? ? ? ? ? ? ? "field" : "price",? ? ? //字段,必須為數值類型
? ? ? ? ? ? ? ? "interval" : 50,? ? ? ?//分桶間距
? ? ? ? ? ? ? ? "min_doc_count" : 1,? ? //最少文檔數桶過濾,只有不少于這么多文檔的桶才會返回
? ? ? ? ? ? ? ? "extended_bounds" : { //范圍擴展
? ? ? ? ? ? ? ? ? ? "min" : 0,
? ? ? ? ? ? ? ? ? ? "max" : 500
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "order" : { "_count" : "desc" },//對桶排序,如果 histogram 聚合有一個權值聚合類型的"直接"子聚合,那么排序可以使用子聚合中的結果
? ? ? ? ? ? ? ? "keyed":true, //hash結構返回,默認以數組形式返回每一個桶
? ? ? ? ? ? ? ? "missing":0 //配置缺省默認值
? ? ? ? ? ? }
? ? ? ? }
? ? }

Date Histogram Aggregation,日期直方圖聚。基于日期類型,以【日期間隔】來桶分聚合。可用的時間間隔類型為:year、quarter、month、week、day、hour、minute、second,其中,除了year、quarter 和 month,其余可用小數形式。

POST /bank/_search?size=0
{
? ? "aggs" : {
? ? ? ? "articles_over_time" : {
? ? ? ? ? ? "date_histogram" : {
? ? ? ? ? ? ? ? "field" : "date",
? ? ? ? ? ? ? ? "interval" : "month",
? ? ? ? ? ? ? ? "format" : "yyyy-MM-dd",? ? //定義日期的格式
? ? ? ? ? ? ? ? "time_zone": "+08:00"? ? ? ?//定義時區,用作時間值的調整
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

2.7?Missing Aggregation

Missing Aggregation,缺失值的桶聚合

POST /bank/_search?size=0
{
? ? "aggs" : {
? ? ? ? "account_without_a_age" : {
? ? ? ? ? ? "missing" : { "field" : "age" }
? ? ? ? }
? ? }
}

2.8 IP范圍聚合

IP Range Aggregation,基于一個 IPv4 字段,對文檔進行【IPv4范圍】的桶分聚合。和 Range Aggregation 類似,只是應用字段必須是 IPv4 數據類型。它屬于multi-bucket。

GET /ip_addresses/_search
{
? ? "size": 10,
? ? "aggs" : {
? ? ? ? "ip_ranges" : {
? ? ? ? ? ? "ip_range" : {
? ? ? ? ? ? ? ? "field" : "ip",
? ? ? ? ? ? ? ? "ranges" : [
? ? ? ? ? ? ? ? ? ? { "to" : "10.0.0.5" },
? ? ? ? ? ? ? ? ? ? { "from" : "10.0.0.5" }
? ? ? ? ? ? ? ? ]
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
{//返回
? ? "aggregations": {
? ? ? ? "ip_ranges": {
? ? ? ? ? ? "buckets" : [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "to": "10.0.0.5",
? ? ? ? ? ? ? ? ? ? "doc_count": 10
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? "from": "10.0.0.5",
? ? ? ? ? ? ? ? ? ? "doc_count": 260
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ]
? ? ? ? }
? ? }
}

2.9?Nested Aggregation

Nested Aggregation,嵌套類型聚合。基于嵌套(nested)數據類型,把該【嵌套類型的信息】聚合到單個桶里,然后就可以對嵌套類型做進一步的聚合操作。

3.?矩陣聚合

Matrix,矩陣聚合。此功能是實驗性的,在將來的版本中可能會完全更改或刪除。

它對多個字段進行操作并根據從請求的文檔字段中提取的值生成矩陣結果的聚合系列。與度量聚合和桶聚合不同,此聚合系列尚不支持腳本編寫。

4.?管道聚合

Pipeline,管道聚合。它對其它聚合操作的輸出(桶或者桶的某些權值)及其關聯指標進行聚合,而不是文檔,是一種后期對每個分桶的一些計算操作。管道聚合的作用是為輸出增加一些有用信息。

管道聚合不能包含子聚合,但是某些類型的管道聚合可以鏈式使用(比如計算導數的導數)。

管道聚合大致分為兩類:

  • parent,它輸入是其【父聚合】的輸出,并對其進行進一步處理。一般不生成新的桶,而是對父聚合桶信息的增強。

  • sibling,它輸入是其【兄弟聚合】的輸出。并能在同級上計算新的聚合。

管道聚合通過 buckets_path 參數指定他們要進行聚合計算的權值對象,bucket_path語法

聚合分隔符 =?">",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定父子聚合關系,如:"my_bucket>my_stats.avg"
權值分隔符=?".",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定聚合的特定權值
聚合名稱? ? =?<name of the aggregation> ,? ? ? ? ? ? ? 直接指定聚合的名稱
權值? ? ? ? ? ?=?<name of the metric> ,? ? ? ? ? ? ? ? ? ? ? ?直接指定權值
完整路徑? ? =?agg_name[> agg_name]*[. metrics] , 綜合利用上面的方式指定完整路徑
特殊值? ? ? ?=?"_count",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?輸入的文檔個數

特殊情況

  • 要進行 pipeline aggregation 聚合的對象名稱或權值名稱包含小數點,"buckets_path": "my_percentile[99.9]"
  • 處理對象中包含空桶(無文檔的桶分),參數 gap_policy,可選值有 skip、insert_zeros

4.1?Derivative Aggregation:parent

Derivative Aggregation,求導聚合。基于父聚合(只能是histogram或date_histogram類型)的某個權值,對權值求導。用于求導的權值必須是數值類型。封閉直方圖(histogram)聚合的 min_doc_count 必須是 0。

{
? ? "aggs" : {
? ? ? ? "sales_per_month" : {
? ? ? ? ? ? "date_histogram" : {
? ? ? ? ? ? ? ? "field" : "date",
? ? ? ? ? ? ? ? "interval" : "month"
? ? ? ? ? ? },
? ? ? ? ? ? "aggs": {
? ? ? ? ? ? ? ? "sales": {
? ? ? ? ? ? ? ? ? ? "sum": {
? ? ? ? ? ? ? ? ? ? ? ? "field": "price"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "sales_deriv": { ? ? ? //對每個月銷售總和 sales 求導
? ? ? ? ? ? ? ? ? ? "derivative": {
? ? ? ? ? ? ? ? ? ? ? ? "buckets_path": "sales" ?//用于計算均值的權值路徑,同級,直接用metric值
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

4.2?Moving Average Aggregation:parent

Moving Average Aggregation,窗口平均值聚合。基于已經排序過的數據,計算出處在當前出口中數據的平均值。比如窗口大小為 5 ,對數據 1—10 的部分窗口平均值如下:

  • (1 + 2 + 3 + 4 + 5) / 5 = 3
  • (2 + 3 + 4 + 5 + 6) / 5 = 4
  • (3 + 4 + 5 + 6 + 7) / 5 = 5
  • etc

POST /_search
{
? ? "size": 0,
? ? "aggs": {
? ? ? ? "my_date_histo":{
? ? ? ? ? ? "date_histogram":{
? ? ? ? ? ? ? ? "field":"date",
? ? ? ? ? ? ? ? "interval":"1M"
? ? ? ? ? ? },
? ? ? ? ? ? "aggs":{
? ? ? ? ? ? ? ? "the_sum":{
? ? ? ? ? ? ? ? ? ? "sum":{ "field": "price" }
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? "the_movavg":{
? ? ? ? ? ? ? ? ? ? "moving_avg":{
? ? ? ? ? ? ? ? ? ? ? ? "buckets_path": "the_sum",//用于計算均值的權值路徑
? ? ? ? ? ? ? ? ? ? ? ? "window" : 30,?? ??? ??? ?//窗口大小
? ? ? ? ? ? ? ? ? ? ? ? "model" : "simple"?? ??? ?//移動模型
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

4.3?Bucket Script Aggregation:parent

Bucket Script Aggregation,桶腳本聚合。基于父聚合的【一個或多個權值】,對這些權值通過腳本進行運算。用于計算的父聚合必須是多桶聚合。用于計算的權值必須是數值類型。執行腳本必須要返回數值型結果。

4.4?Bucket Selector Aggregation:parent

Bucket Selector Aggregation,桶選擇器聚合。基于父聚合的【一個或多個權值】,通過腳本對權值進行計算,并決定父聚合的哪些桶需要保留,其余的將被丟棄。用于計算的父聚合必須是多桶聚合。用于計算的權值必須是數值類型。運算的腳本必須是返回 boolean 類型,如果腳本是腳本表達式形式給出,那么允許返回數值類型。

4.5?Serial Differencing Aggregation:parent

Serial Differencing Aggregation,串行差分聚合。基于父聚合(只能是histogram或date_histogram類型)的某個權值,對權值值進行差分運算,(取時間間隔,后一刻的值減去前一刻的值:f(X) = f(Xt) – f(Xt-n))。用于計算的父聚合必須是多桶聚合。

4.6?Avg Max Min Sum:sibliing

Avg Bucket Aggregation,桶均值聚合。基于兄弟聚合的某個權值,求所有桶的權值均值。使用規則:用于計算的兄弟聚合必須是多桶聚合。用于計算的權值必須是數值類型。

Max Bucket Aggregation,桶最大值聚合。基于兄弟聚合的某個權值,輸出權值最大的那一個桶。使用規則同上

Min Bucket Aggregation,桶最小值聚合。基于兄弟聚合的某個權值,輸出權值最小的一個桶。使用規則同上

Sum Bucket Aggregation,桶求和聚合。基于兄弟聚合的權值,對所有桶的權值求和。使用規則同上

POST /_search
{
? "size": 0,
? "aggs": {
? ? "sales_per_month": {
? ? ? "date_histogram": {
? ? ? ? "field": "date",
? ? ? ? "interval": "month"
? ? ? },
? ? ? "aggs": {
? ? ? ? "sales": {
? ? ? ? ? "sum": {
? ? ? ? ? ? "field": "price"
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? },
? ? "avg_monthly_sales": {
? ? ? "avg_bucket": {
? ? ? ? "buckets_path": "sales_per_month>sales"?
? ? ? }
? ? }
? }
}

4.7?Stats Bucket Aggregation:sibliing

Stats Bucket Aggregation,桶統計信息聚合。基于兄弟聚合的某個權值,對【桶的信息】進行一些統計學運算(總計多少個桶、所有桶中該權值的最大值、最小等)。用于計算的權值必須是數值類型。用于計算的兄弟聚合必須是多桶聚合類型。

{
? ? "aggs" : {
? ? ? ? "sales_per_month" : {
? ? ? ? ? ? "date_histogram" : {
? ? ? ? ? ? ? ? "field" : "date",
? ? ? ? ? ? ? ? "interval" : "month"
? ? ? ? ? ? },
? ? ? ? ? ? "aggs": {
? ? ? ? ? ? ? ? "sales": {
? ? ? ? ? ? ? ? ? ? "sum": {
? ? ? ? ? ? ? ? ? ? ? ? "field": "price"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? },
? ? ? ? "stats_monthly_sales": { //對父聚合的每個桶(每月銷售總和)的一些基本信息進行聚合
? ? ? ? ? ? "stats_bucket": {
? ? ? ? ? ? ? ? "buckets_paths": "sales_per_month>sales"?
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
{//輸出結果
? ?"aggregations": {
? ? ? "sales_per_month": {
? ? ? ? ?"buckets": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ?"key_as_string": "2015/01/01 00:00:00",
? ? ? ? ? ? ? ?"key": 1420070400000,
? ? ? ? ? ? ? ?"doc_count": 3,
? ? ? ? ? ? ? ?"sales": {
? ? ? ? ? ? ? ? ? "value": 550
? ? ? ? ? ? ? ?}
? ? ? ? ? ? },
? ? ? ? ? ? {
? ? ? ? ? ? ? ?"key_as_string": "2015/02/01 00:00:00",
? ? ? ? ? ? ? ?"key": 1422748800000,
? ? ? ? ? ? ? ?"doc_count": 2,
? ? ? ? ? ? ? ?"sales": {
? ? ? ? ? ? ? ? ? "value": 60
? ? ? ? ? ? ? ?}
? ? ? ? ? ? },
? ? ? ? ? ? {
? ? ? ? ? ? ? ?"key_as_string": "2015/03/01 00:00:00",
? ? ? ? ? ? ? ?"key": 1425168000000,
? ? ? ? ? ? ? ?"doc_count": 2,
? ? ? ? ? ? ? ?"sales": {
? ? ? ? ? ? ? ? ? "value": 375
? ? ? ? ? ? ? ?}
? ? ? ? ? ? }
? ? ? ? ?]
? ? ? },
? ? ? "stats_monthly_sales": { ? ? ? ?//注意,統計的是桶的信息
? ? ? ? ?"count": 3,
? ? ? ? ?"min": 60,
? ? ? ? ?"max": 550,
? ? ? ? ?"avg": 328.333333333,
? ? ? ? ?"sum": 985
? ? ? }
? ?}
}

4.8?Extended Stats Bucket Aggregation:sibliing

Extended Stats Bucket Aggregation,擴展桶統計聚合。基于兄弟聚合的某個權值,對【桶信息】進行一系列統計學計算(比普通的統計聚合多了一些統計值)。用于計算的權值必須是數值類型。用于計算的兄弟聚合必須是多桶聚合類型。

4.9?Percentiles Bucket Aggregation:sibliing

Percentiles Bucket Aggregation,桶百分比聚合。基于兄弟聚合的某個權值,計算權值的百分比。用于計算的權值必須是數值類型。用于計算的兄弟聚合必須是多桶聚合類型。對百分比的計算是精確的(不像Percentiles Metric聚合是近似值),所以可能會消耗大量內存。

總結,ES默認給?大多數?字段啟用 doc values,所以在一些搜索場景大大的節省了內存使用量,但是需要注意的是只有不分詞的 string 類型的字段才能使用這種特性。使聚合運行在?not_analyzed?字符串而不是?analyzed?字符串,這樣可以有效的利用 doc values 。

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的Elasticsearch笔记(七):聚合查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。