(转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询
轉自: https://blog.csdn.net/zx711166/article/details/81906881
聚合查詢
聚合是一種基于查詢條件對數據進行分桶、計算的方法。
聚合可以嵌套,由此可以組合復雜的操作(Bucketing 聚合可以包含 sub-aggregation)。
聚合的三種分類:
Metric(指標聚合):
對文檔進行權值計算,輸出結果既是權值。
基于特定字段(field)或腳本值(generated using scripts)計算。
Bucketing(分桶聚合):
對文檔進行分組操作,把滿足相關特性的文檔分到一個桶里,即桶分。輸出結果是包含多個文檔的桶。
基于一個關鍵字(field、script),以及一些桶分(分組)的判斷條件進行聚合,符合條件的會分到對應的組(fall in)。
Pipeline(管道聚合):
對其它聚合操作的輸出以及關聯指標進行聚合。
此類聚合的作用對象大多是桶,而不是文檔,是一種后期對每一個分桶的一些計算操作。
指標聚合
sum 聚合(single-value)
sum是一個求累加值的聚合,其作用與關系型數據庫中相同。
Top hits 聚合
最高匹配權值聚合,跟蹤聚合中相關性最高的文檔。
該聚合一般用做 sub-aggregation,以此來聚合每個桶中的最高匹配的文檔。
參數:
from:最匹配的結果中的文檔個數偏移;
size:top matching hits 返回的最大文檔個數(default 3);
sort:最匹配的文檔的排序方式。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值。
GET /lib4/items/_search
{
??? "size": 0, # 表示查詢多少條文檔,聚合只需就和結果,輸出文檔可以設置為0條
??? "aggs": {
??????? "price_of_sum": { # 自行取名作為結果集
??????????? "sum": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
min 聚合(single)
min是一個求最小值的聚合,其作用與關系型數據庫中相同。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_min": {
??????????? "min": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
//最小值,script
{
?? ?"size", 0
??? "aggs" : {
??????? "price_of_min_script" : {
??????????? "min" : {
??????????????? "script" : {??????????????? //script 計算 value
??????????????????? "file": "my_script",
??????????????????? "params": {
??????????????????????? "field": "price"
?????????????? ??? ?}
?????????? ??? ?}
??????? ??? ?}
?? ??? ?}
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
max 聚合(single)
max是一個求最大值聚合,其作用與關系型數據庫中相同。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_max": {
??????????? "max": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
avg 聚合(single-value numeric metrics)
avg是一個求平均值的聚合,其作用與關系型數據庫中相同。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_avg": {
??????????? "avg": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
cardinality 聚合(single-value)
cardinality是一個求基數的聚合,其作用與關系型數據庫中相同。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
precision_threshold:精度閾值,用于處理準確度問題;
missing:文檔缺失字段時的默認值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_cardi": {
??????????? "cardinality": { # 其實相當于該字段互不相同的值有多少類,輸出的是種類數
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
stats 聚合(multi-value)
統計聚合,基于文檔的某個值,計算出一些統計信息(min、max、sum、count、avg)。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值。
{
??? "aggs" : {
??????? "grades_stats" : {
?????? ??? ?"stats" : {
?????? ??? ??? ?"field" : "grade"
?????? ??? ?}
??????? }
??? }
}
//輸出
{
??? ...
??? "aggregations": {
??????? "grades_stats": {
??????????? "count": 6,
??????????? "min": 60,
??????????? "max": 98,
??????????? "avg": 78.5,
??????????? "sum": 471
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Extended stats 聚合(multi-value)
擴展統計聚合,基于文檔的某個值,計算出一些統計信息(比普通的stats聚合多了sum_of_squares、variance、std_deviation、std_deviation_bounds)。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺失字段時的默認值;
sigma:標準差界限。
{
??? ...
??? "aggregations": {
??????? "grade_stats": {
?????????? "count": 9,
?????????? "min": 72,
?????????? "max": 99,
?????????? "avg": 86,
?????????? "sum": 774,
?????????? //輸出比 stats 聚合多了一些值
?????????? "sum_of_squares": 67028,
?????????? "variance": 51.55555555555556,
?????????? "std_deviation": 7.180219742846005,
?????????? "std_deviation_bounds": {
??????????? "upper": 100.36043948569201,
??????????? "lower": 71.63956051430799
?????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Geo Bounds 聚合
地理邊界聚合,基于文檔的某個字段(geo-point類型字段),計算出該字段所有地理坐標點的邊界(左上角/右下角坐標點)。
參數:
field:用于計算的字段;
wrap_longitude:是否允許地理邊界與國際日界線存在重疊。
{
??? "query" : {
??????? "match" : { "business_type" : "shop" }
??? },
??? "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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Geo Centroid 聚合
地理重心聚合,基于文檔的某個字段(geo-point類型字段),計算所有坐標的加權重心。
參數:
field:用于計算的字段(geo-point類型)。
{
??? "query" : {
??????? "match" : { "crime" : "burglary" }
??? },
??? "aggs" : {
??????? "centroid" : {
??????????? "geo_centroid" : {
??????????????? "field" : "location"
??????????? }
??????? }
??? }
}
//輸出
{
??? ...
??? "aggregations": {
??????? "centroid": {
??????????? "location": {????? //重心經緯度
??????????????? "lat": 80.45,
??????????????? "lon": -160.22
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Percentiles 聚合(multi-value)
百分百聚合,基于聚合文檔中某個數值類型的值,求這些值中。
參數:
field:用于計算的字段;
script:由腳本生成用來計算的 value;
missing:文檔缺省字段時的默認。
Script Metric 聚合
基于腳本的權值聚合,用腳本來計算出一個權值。
參數:
init_script:用于計算的字段;
map_script:由腳本生成用來計算的 value;
combine_script:文檔缺省字段時的默認值;
reduce_script:
{
??? "query" : {
??????? "match_all" : {}
??? },
??? "aggs": {
??????? "profit": {
??????????? "scripted_metric": {
??????????????? "init_script" : "_agg['transactions'] = []",
??????????????? "map_script" : "if (doc['type'].value == \"sale\") { _agg.transactions.add(doc['amount'].value) } else { _agg.transactions.add(-1 * doc['amount'].value) }",
??????????????? "combine_script" : "profit = 0; for (t in _agg.transactions) { profit += t }; return profit",
??????????????? "reduce_script" : "profit = 0; for (a in _aggs) { profit += a }; return profit"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Top hits 聚合
最高匹配權值聚合,跟蹤聚合中相關性最高的文檔。
該聚合一般用做 sub-aggregation,以此來聚合每個桶中的最高匹配的文檔。
參數:
from:最匹配的結果中的文檔個數偏移;
size:top matching hits 返回的最大文檔個數(default 3);
sort:最匹配的文檔的排序方式。
{
??? "aggs": {
??????? "top-tags": {
??????????? "terms": {
??????????????? "field": "tags",
??????????????? "size": 3
??????????? },
??????????? "aggs": {
??????????????? "top_tag_hits": {
??????????????????? "top_hits": {????????????????? //用 tags 字段分組,每個 tag(即一個分組)只顯示最后一個問題,并且只在 _source 中保留 title 字段
??????????????????????? "sort": [
??????????????????????????? {
??????????????????????????????? "last_activity_date": {
??????????????????????????????????? "order": "desc"
??????????????????????????????? }
??????????????????????????? }
??????????????????????? ],
??????????????????????? "_source": {
??????????????????????????? "include": [
??????????????????????????????? "title"
??????????????????????????? ]
??????????????????????? },
??????????????????????? "size" : 1
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
}
//輸出
"top_tags_hits": {
???? "hits": {
????????? "total": 25365,
????????? "max_score": 1,
????????? "hits": [
????????????? {
???????????????? "_index": "stack",
???????????????? "_type": "question",
???????????????? "_id": "602679",
???????????????? "_score": 1,
???????????????? "_source": {
????????????????????? "title": "Windows port opening"
???????????????? },
???????????????? "sort": [
????????????????? ]
?????????????? }
?????????? ]
???? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Value Count 聚合(single-value)
值計數聚合,計算聚合文檔中某個值的個數。
用于計數的值可以是特定的數值型字段,也可以通過腳本計算而來。
該聚合一般域其它 single-value 聚合聯合使用,比如在計算一個字段的平均值的時候,可能還會關注這個平均值是由多少個值計算而來。
參數:
field:用于計算的字段
script:由腳本生成用來計算的 value
{
??? "aggs" : {
??????? "grades_count" : {
?????? ??? ?"value_count" : {
?????? ??? ??? ?"field" : "grade"
?????? ??? ?}
??????? }??? //計算 grade 字段共有多少個值,和 cardinality 聚合不同的
??? }
}
1
2
3
4
5
6
7
8
9
桶聚合查詢
histogram 聚合(multi-bucket)
直方圖聚合,基于文檔中的某個【數值類型】字段,通過計算來動態的分桶。
計算如下:
rem = value % interval
if (rem < 0) {
??? rem += interval
}
bucket_key = value - rem
1
2
3
4
5
參數:
field:字段,必須為數值類型
interval:分桶間距
min_doc_count:最少文檔數桶過濾,只有不少于這么多文檔的桶才會返回
extended_bounds:范圍擴展
order:對桶排序,如果 histogram 聚合有一個權值聚合類型的"直接"子聚合,那么排序可以使用子聚合中的結果
offset:桶邊界位移,默認從0開始
keyed:hash結構返回,默認以數組形式返回每一個桶
missing:配置缺省默認值
{
??? "aggs" : {
??????? "prices" : {
??????????? "histogram" : {
??????????????? "field" : "price",
??????????????? "interval" : 50,
??????????????? "min_doc_count" : 1,
??????????????? "extended_bounds" : {
??????????????????? "min" : 0,
??????????????????? "max" : 500
??????????????? },
??????????????? "order" : { "_count" : "desc" },
??????????????? "keyed":true,
??????????????? "missing":0
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Data Histogram 聚合(multi-bucket)
日期直方圖聚合——基于日期類型,以【日期間隔】來桶分聚合。
可用的時間間隔類型為:
year、quarter、month、week、day、hour、minute、second
其中,除了year、quarter 和 month,其余可用小數形式。
參數:
field:字段,必須為數值類型
interval:分桶間距
format:定義日期的格式,配置后會返回一個 key_as_string 的字符串類型日期(默認只有key)
time_zone:定義時區,用作時間值的調整
offset:桶邊界位移,默認從0開始
missing:配置缺省默認值
{
??? "aggs" : {
??????? "articles_over_time" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month",
??????????????? "format" : "yyyy-MM-dd",
??????????????? "time_zone": "+08:00"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
Range 聚合(multi-bucket)
范圍聚合——基于某個值(可以是 field 或 script),以【字段范圍】來桶分聚合。
范圍聚合包括 from 值,不包括 to 值(區間前閉后開)。
參數:
ranges:配置區間,數組,每一個元素是一個區間。例如:[{from:0}, {from:50, to:100}, {to:200}]
keyed:以一個關聯的唯一字符串作為鍵,以 HASH 形式返回,而不是默認的數組
script:利用 script 執行結果替代普通的 field 值進行聚合。script可以用file給出,還可以對其它 field 進行求值計算。
{
??? "aggs" : {
??????? "price_ranges" : {
??????????? "range" : {
??????????????? "field" : "price",
??????????????? "ranges" : [?????????????????????? //包含 3 個桶
??????????????????? { "to" : 50 },
??????????????????? { "from" : 50, "to" : 100 },
??????????????????? { "from" : 100 }
??????????????? ],
??????????????? "keyed" : true
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Date Range 聚合(multi-bucket)
日期范圍聚合,基于日期類型的值,以【日期范圍】來桶分聚合。
日期范圍可以用各種 Date Math 表達式。
同樣的,包括 from 的值,不包括 to 的值。
參數:
format:定義日期格式,配置后會返回一個 [to/from]_as_string 的字符串類型日期,默認是 to/from 的數值表示。
{
??? "aggs": {
??????? "range": {
??????????? "date_range": {
??????????????? "field": "date",
??????????????? "format": "MM-yyy",????????????? ?
??????????????? "ranges": [??????????????????????????? //包含 3 個桶
??????????????????? { "to": "now-10M/M" },
??????????????????? { "from": "now-10M/M" },
??????????????????? {"from":"1970-1-1", "to":"2000-1-1"}
??????????????? ]
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
terms 聚合(multi-bucket)
terms是一個分組聚合,其作用與關系型數據庫中相同。
默認返回順序是按照文檔個數多少排序。
當不返回所有 buckets 的情況,文檔個數可能不準確
參數:
size:size用來定義需要返回多個 buckets(防止太多),默認會全部返回。(注意,如果只返回部分buckets,統計的文檔個數不一定準確(每個分片各自的top size個)。size 越大,count 會越精確。)
order:排序方式
min_doc_count:只返回文檔個數不小于該值的 buckets
script:用基本來生成詞元
include:包含過濾
exclude:排除過濾
execution_hint:
collect_mode:
missing:配置缺省默認值
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_by": {
??????????? "terms": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
# 對那些有唱歌興趣的用戶按年齡分組
GET /lib3/user/_search
{
??? "query": {
??????? "match": {
??????????? "interests": "changge"
??????? }
??? },
??? "size": 0,
??? "aggs": {
??????? "agg_group_by": {
??????????? "field": "age",
??????????? "order": {
??????????????? "avg_of_age": "desc"
??????????? }
??????? },
??????? "aggs": {
??????????? "avg_of_age": {
??????????????? "age": {
??????????????????? "field": "age"
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Filters 聚合(multi-bucket)
多過濾聚合,基于多個過濾條件,來對當前文檔進行【過濾】的聚合,每個過濾都包含所有滿足它的文檔(多個bucket中可能重復)。
參數:
filters: 配置過濾條件,支持 HASH 或 數組格式
other_bucket: 是否計算不滿足任何匹配條件的文檔
other_bucket_key: 作為不匹配所有過濾條件的文檔的 bucket 名稱
{
? "aggs" : {
??? "messages" : {
????? "filters" : {
??????? "other_bucket_key": "other_messages",??????????????? //不在過濾條件范圍內的文檔都歸屬于 other_messages 桶
??????? "filters" : {??????????????????????????????????????? //過濾條件
????????? "errors" :?? { "term" : { "body" : "error"?? }},? ?
????????? "warnings" : { "term" : { "body" : "warning" }}
??????? }
????? },
????? "aggs" : {
??????? "monthly" : {
????????? "histogram" : {
??????????? "field" : "timestamp",
??????????? "interval" : "1M"
????????? }
??????? }
????? }
??? }
? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Filter 聚合(single-bucket)
過濾聚合,基于一個條件,來對當前的文檔進行過濾的聚合。
{
??? "aggs" : {
??????? "red_products" : {
??????????? "filter" : { "term": { "color": "red" } },
??????????? "aggs" : {
??????????????? "avg_price" : { "avg" : { "field" : "price" } }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
IPv4 Range 聚合(multi-bucket)
IP4聚合——基于一個 IPv4 字段,對文檔進行【IPv4范圍】的桶分聚合。
和 Range Aggregation 類似,只是應用字段必須是 IPv4 數據類型。
{
??? "aggs" : {
??????? "ip_ranges" : {
??????????? "ip_range" : {
??????????????? "field" : "ip",
??????????????? "ranges" : [??????????????????????????????? //包含 3 個桶,各個桶之間可能有文檔重復
??????????????????? { "to" : "10.0.0.5" },
??????????????????? { "from" : "10.0.0.5" },
??????????????????? { "from":"1.1.1.1", "to" : "10.0.0.5" },
??????????????? ]
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Nested 聚合(single-bucket)
嵌套類型聚合,基于嵌套(nested)數據類型,把該【嵌套類型的信息】聚合到單個桶里,然后就可以對嵌套類型做進一步的聚合操作。
// resellers 是一個嵌套類型
{
??? ...
??? "product" : {
??????? "properties" : {
??????????? "resellers" : {
??????????????? "type" : "nested",
??????????????? "properties" : {
??????????????????? "name" : { "type" : "string" },
??????????????????? "price" : { "type" : "double" }
??????????????? }
??????????? }
??????? }
??? }
}
// 對 nested 對象里面的信息做其它聚合操作
{
??? "query" : {
??????? "match" : { "name" : "led tv" }
??? },
??? "aggs" : {
??????? "resellers" : {
??????????? "nested" : {?????????????????????????? //"嵌套類型聚合"把所有嵌套信息都包含在單一的桶里,以供進一步處理
??????????????? "path" : "resellers"
??????????? },
??????????? "aggs" : {
??????????????? "min_price" : { "min" : { "field" : "resellers.price" } }?? //對嵌套類型聚合輸出的桶做進一步處理,這里是計算其 price 的 average
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
管道聚合
管道聚合處理的對象是其它聚合的輸出(桶或者桶的某些權值),而不是直接針對文檔。
管道聚合的作用是為輸出增加一些有用信息。
管道聚合大致分為兩類:
parent
此類聚合的"輸入"是其【父聚合】的輸出,并對其進行進一步處理。一般不生成新的桶,而是對父聚合桶信息的增強。
sibling
此類聚合的輸入是其【兄弟聚合】的輸出。并能在同級上計算新的聚合。
管道聚合通過 buckets_path 參數指定他們要進行聚合計算的權值對象,buckets_path 參數有其自己的使用語法。
管道聚合不能包含子聚合,但是某些類型的管道聚合可以鏈式使用(比如計算導數的導數)。
bucket_path語法
聚合分隔符 ==> “>”,指定父子聚合關系,如:“my_bucket>my_stats.avg”
權值分隔符 ==> “.”,指定聚合的特定權值
聚合名稱 ==> ,直接指定聚合的名稱
權值 ==> ,直接指定權值
完整路徑 ==> agg_name[> agg_name]*[. metrics] ,綜合利用上面的方式指定完整路徑
特殊值 ==> “_count”,輸入的文檔個數
特殊情況
要進行 pipeline aggregation 聚合的對象名稱或權值名稱包含小數點
“buckets_path”: “my_percentile[99.9]”
處理對象中包含空桶(無文檔的桶分)
參數 gap_policy,可選值有 skip、insert_zeros
Avg Bucket 聚合(sibliing)
桶均值聚合,基于兄弟聚合的某個權值,求所有桶的權值均值。
用于計算的兄弟聚合必須是多桶聚合。
用于計算的權值必須是數值類型。
參數:
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? }
??????????? }
??????? },
??????? "avg_monthly_sales": {
??????????? "avg_bucket": {???????????? //對所有月份的銷售總 sales 求平均值
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Derivative 聚合(parent)
求導聚合,基于父聚合(只能是histogram或date_histogram類型)的某個權值,對權值求導。
用于求導的權值必須是數值類型。
封閉直方圖(histogram)聚合的 min_doc_count 必須是 0。
參數:
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? },
??????????????? "sales_deriv": {?????? //對每個月銷售總和 sales 求導
??????????????????? "derivative": {
??????????????????????? "buckets_path": "sales"? //同級,直接用 metric 值
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Max Bucket 聚合(sibling)
桶最大值聚合,基于兄弟聚合的某個權值,輸出權值最大的那一個桶。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
參數:
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
Min Bucket 聚合(sibling)
桶最小值聚合,基于兄弟聚合的某個權值,輸出權值最小的一個桶。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
參數
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
Sum Buchet 聚合(sibling)
桶求和聚合,基于兄弟聚合的權值,對所有桶的權值求和。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
參數
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? }
??????????? }
??????? },
??????? "max_monthly_sales": {??????? //輸出兄弟聚合 sales_per_month 的每月銷售總和 sales 的最大一個桶
??????????? "max_bucket": {
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? },
??????? "min_monthly_sales": {???????? //輸出兄弟聚合 sales_per_month 的每月銷售總和 sales 的最小一個桶
??????????? "min_bucket": {
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? },
??????? "sum_monthly_sales": {???????? //輸出兄弟聚合 sales_per_month 的每月銷售總和 sales 的最小一個桶
??????????? "sum_bucket": {
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Stats Bucket 聚合(sibling)
桶統計信息聚合,基于兄弟聚合的某個權值,對【桶的信息】進行一些統計學運算(總計多少個桶、所有桶中該權值的最大值、最小等)。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
參數
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "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
????? }
?? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
** Extended Stats Bucket 聚合(sibling)**
擴展桶統計聚合,基于兄弟聚合的某個權值,對【桶信息】進行一系列統計學計算(比普通的統計聚合多了一些統計值)。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
參數
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
sigma:偏差顯示位置(above/below)
** Percentiles Bucket 聚合(sibling)**
桶百分比聚合,基于兄弟聚合的某個權值,計算權值的百分百。
用于計算的權值必須是數值類型。
用于計算的兄弟聚合必須是多桶聚合類型。
對百分百的計算是精確的(不像Percentiles Metric聚合是近似值),所以可能會消耗大量內存
參數:
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
percents:需要計算的百分百列表(數組形式)
Moving Average 聚合(parent)
窗口平均值聚合,基于已經排序過的數據,計算出處在當前出口中數據的平均值。
比如窗口大小為 5 ,對數據 1—10 的部分窗口平均值如下:
(1 + 2 + 3 + 4 + 5) / 5 = 3
(2 + 3 + 4 + 5 + 6) / 5 = 4
(3 + 4 + 5 + 6 + 7) / 5 = 5
參數:
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
window:窗口大小
model:移動模型
minimize:
settings:
{
??? "the_movavg":{
??????? "moving_avg":{
??????????? "buckets_path": "the_sum",
??????????? "window" : 30,
??????????? "model" : "simple"
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
Cumulative Sum 聚合(parent)
累計和聚合,基于父聚合(只能是histogram或date_histogram類型)的某個權值,對權值在每一個桶中求所有之前的桶的該值累計的和。
用于計算的權值必須是數值類型。
封閉直方圖(histogram)聚合的 min_doc_count 必須是 0。
參數:
buckets_path:用于計算均值的權值路徑
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? },
??????????????? "cumulative_sales": {
??????????????????? "cumulative_sum": {
??????????????????????? "buckets_path": "sales"
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
}
//輸出
{
?? "aggregations": {
????? "sales_per_month": {
???????? "buckets": [
??????????? {
?????????????? "key_as_string": "2015/01/01 00:00:00",
?????????????? "key": 1420070400000,
?????????????? "doc_count": 3,
?????????????? "sales": {
????????????????? "value": 550
?????????????? },
?????????????? "cumulative_sales": {
????????????????? "value": 550??????????????? //總計 sales = 550
?????????????? }
??????????? },
??????????? {
?????????????? "key_as_string": "2015/02/01 00:00:00",
?????????????? "key": 1422748800000,
?????????????? "doc_count": 2,
?????????????? "sales": {
????????????????? "value": 60
?????????????? },
?????????????? "cumulative_sales": {
????????????????? "value": 610?????????????? //總計 sales = 550 + 60
?????????????? }
??????????? },
??????????? ...
???????? ]
????? }
?? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
** Bucket Script 聚合(parent)**
桶腳本聚合,基于父聚合的【一個或多個權值】,對這些權值通過腳本進行運算。
用于計算的父聚合必須是多桶聚合。
用于計算的權值必須是數值類型。
執行腳本必須要返回數值型結果。
參數
script:用于計算的腳本,腳本可以是 inline,也可以是 file,還可以是 Scripting 指定的
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "total_sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? },
??????????????? "t-shirts": {
????????????????? "filter": {
??????????????????? "term": {
????????????????????? "type": "t-shirt"
??????????????????? }
????????????????? },
????????????????? "aggs": {
??????????????????? "sales": {
????????????????????? "sum": {
??????????????????????? "field": "price"
????????????????????? }
??????????????????? }
????????????????? }
??????????????? },
??????????????? "t-shirt-percentage": {
??????????????????? "bucket_script": {
??????????????????????? "buckets_path": {??????????????????? //對兩個權值進行計算
????????????????????????? "tShirtSales": "t-shirts>sales",
????????????????????????? "totalSales": "total_sales"
??????????????????????? },
??????????????????????? "script": "tShirtSales / totalSales * 100"
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Bucket Selector 聚合(parent)
桶選擇器聚合,基于父聚合的【一個或多個權值】,通過腳本對權值進行計算,并決定父聚合的哪些桶需要保留,其余的將被丟棄。
用于計算的父聚合必須是多桶聚合。
用于計算的權值必須是數值類型。
運算的腳本必須是返回 boolean 類型,如果腳本是腳本表達式形式給出,那么允許返回數值類型。
參數:
script:用于計算的腳本,腳本可以是 inline,也可以是 file,還可以是 Scripting 指定的
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
{
??? "bucket_selector": {
??????? "buckets_path": {
??????????? "my_var1": "the_sum",
??????????? "my_var2": "the_value_count"
??????? },
??????? "script": "my_var1 > my_var2"??? // true 則保留該桶;false 則丟棄
??? }
}
1
2
3
4
5
6
7
8
9
** Serial Differencing 聚合(parent)**
串行差分聚合,基于父聚合(只能是histogram或date_histogram類型)的某個權值,對權值值進行差分運算,(取時間間隔,后一刻的值減去前一刻的值:f(X) = f(Xt) – f(Xt-n))。
用于計算的父聚合必須是多桶聚合。
參數
lag:滯后間隔(比如lag=7,表示每次從當前桶的值中減去其前面第7個桶的值)
buckets_path:用于計算均值的權值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
?? "aggs": {
????? "my_date_histo": {???????????????? ?
???????? "date_histogram": {
??????????? "field": "timestamp",
??????????? "interval": "day"
???????? },
???????? "aggs": {
??????????? "the_sum": {
?????????????? "sum": {
????????????????? "field": "lemmings"??? ?
?????????????? }
??????????? },
??????????? "thirtieth_difference": {
?????????????? "serial_diff": {?????????????? ?
????????????????? "buckets_path": "the_sum",
????????????????? "lag" : 30??????????????????????? //差分間隔為 30 day
?????????????? }
??????????? }
???????? }
????? }
?? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
復合查詢
使用bool查詢
接受以下參數:
must:文檔必須匹配設定條件才能被包含進來
must_not:文檔必須不匹配設定條件才能被包含進來
should:如果滿足語句中的任意語句,將增加_source,否則,無任何影響。主要用于修正每個文檔的相關性得分
filter:必須匹配,但以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文檔
相關性得分是如何組合的?
每一個子查詢都獨自的計算文檔的相關性得分,bool查詢將對計算出的等分進行合并,然后返回一個代表整個布爾操作的等分。
下面的查詢用于查找title字段匹配 how to make millions 并且不被標識為 spam的文檔。那些被標識為 starred 或在2014之后的文檔,將比另外那些文檔擁有更高的排名。如果 兩者 都滿足,那么它的排名將更高。
GET /lib3/user/_search
{
??? "query": {
??????? "bool": {
??????????? "must": {
??????????????? "match": {
??????????????????? "interests": "changge"
??????????????? }
??????????? },
??????????? "must_not": {
??????????????? "match": {
??????????????????? "interests": "lvyou"
??????????????? }
??????????? },
??????????? "should": [
??????????????? {
??????????????????? "match": {
??????????????????????? "address": "bei jing"
??????????????????? }
??????????????? },
??????????????? {
??????????????????? "range": {
??????????????????????? "birthday": {
??????????????????????????? "gte": "1996-01-01"
??????????????????????? }
??????????????????? }
??????????????? }
??????????? ]
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
如果沒有 must 語句,那么至少需要能夠匹配其中的一條 should 語句。但如果存在至少一條 must 語句,則對 should 語句的匹配沒有要求。如果不想因為文檔的時間影響得分,可以用 filter 語句來重寫前面的例子
# 可以在bool內嵌套filter過濾
GET /lib3/user/_search
{
??? "query": {
??????? "bool": {
??????????? "must": {
??????????????? "match": {
??????????????????? "interests": "changge"
??????????????? }
??????????? },
??????????? "must_not": {
??????????????? "match": {
??????????????????? "interests": "lvyou"
??????????????? }
??????????? },
??????????? "should": [
??????????????? {
??????????????????? "match": {
??????????????????????? "address": "bei jing"
??????????????????? }
??????????????? }
??????????? ],
??????????? "filter": {
??????????????? "range": {
??????????????????? "birthday": {
??????????????????????? "gte": "1996-01-01"
??????????????????? }
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
通過將 range 查詢移動到 filter 語句中,我們將它轉成不評分的查詢,將不在影響文檔的相關性排名,由于它現在是一個不評分的查詢,可以使用各種對 filter 查詢有效的優化手段來提升性能。
bool 查詢本身也可以被用作不評分的查詢,簡單的將它放置到 filter 語句中并在內部構建布爾邏輯
# 在bool內嵌套fliter,在fliter下嵌套另一個bool作為過濾條件
GET /lib3/user/_search
{
??? "query": {
??????? "bool": {
??????????? "must": {
??????????????? "match": {
??????????????????? "interests": "changge"
??????????????? }
??????????? },
??????????? "must_not": {
??????????????? "match": {
??????????????????? "interests": "lvyou"
??????????????? }
??????????? },
??????????? "should": [
??????????????? {
??????????????????? "match": {
??????????????????????? "address": "bei jing"
??????????????????? }
??????????????? }
??????????? ],
??????????? "filter": {
??????????????? "bool": {
??????????????????? "must": [
??????????????????????? {
??????????????????????????? "range": {
??????????????????????????????? "birthday": {
??????????????????????????????????? "gte": "1990-01-01"
??????????????????????????????? }
??????????????????????????? }
??????????????????????? },
??????????????????????? {
??????????????????????????? "range": {
??????????????????????????????? "age": {
??????????????????????????????????? "lte": 30
??????????????????????????????? }
??????????????????????????? }
??????????????????????? }
??????????????????? ],
??????????????????? "must_not": [
??????????????????????? {
??????????????????????????? "term": {
??????????????????????????????? "age": "29"
??????????????????????????? }
??????????????????????? }
??????????????????? ]
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
constant_score查詢
constant_score將一個不變的量評分應用于所有匹配的文檔,被經常用于你只需要執行一個 fliter 而沒有其他查詢(例如:評分查詢)的情況下。
請求結構如下:
{
?? ?"constant_score": {
?? ??? ?"filter": {
?? ??? ??? ?"term": {
?? ??? ??? ??? ?"category": "ebooks"
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
1
2
3
4
5
6
7
8
9
示例:
GET /lib4/items/_search
{
??? "query": {
??????? "constant_score": {
??????????? "filter": {
??????????????? "term": {
??????????????????? "interests": "changge"
??????????????? }
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
12
term 查詢被放置在constant_score中,轉成不評分的 filter。這種方式可以用來取代只有 filter 語句的 bool 查詢。
————————————————
版權聲明:本文為CSDN博主「迷途碼界」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zx711166/article/details/81906881
總結
以上是生活随笔為你收集整理的(转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑硬盘资料备份方法(怎么备份电脑硬盘的
- 下一篇: (转)es 聚合查询并返回每个组的数据