(转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询
轉(zhuǎn)自: https://blog.csdn.net/zx711166/article/details/81906881
聚合查詢(xún)
聚合是一種基于查詢(xún)條件對(duì)數(shù)據(jù)進(jìn)行分桶、計(jì)算的方法。
聚合可以嵌套,由此可以組合復(fù)雜的操作(Bucketing 聚合可以包含 sub-aggregation)。
聚合的三種分類(lèi):
Metric(指標(biāo)聚合):
對(duì)文檔進(jìn)行權(quán)值計(jì)算,輸出結(jié)果既是權(quán)值。
基于特定字段(field)或腳本值(generated using scripts)計(jì)算。
Bucketing(分桶聚合):
對(duì)文檔進(jìn)行分組操作,把滿(mǎn)足相關(guān)特性的文檔分到一個(gè)桶里,即桶分。輸出結(jié)果是包含多個(gè)文檔的桶。
基于一個(gè)關(guān)鍵字(field、script),以及一些桶分(分組)的判斷條件進(jìn)行聚合,符合條件的會(huì)分到對(duì)應(yīng)的組(fall in)。
Pipeline(管道聚合):
對(duì)其它聚合操作的輸出以及關(guān)聯(lián)指標(biāo)進(jìn)行聚合。
此類(lèi)聚合的作用對(duì)象大多是桶,而不是文檔,是一種后期對(duì)每一個(gè)分桶的一些計(jì)算操作。
指標(biāo)聚合
sum 聚合(single-value)
sum是一個(gè)求累加值的聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
Top hits 聚合
最高匹配權(quán)值聚合,跟蹤聚合中相關(guān)性最高的文檔。
該聚合一般用做 sub-aggregation,以此來(lái)聚合每個(gè)桶中的最高匹配的文檔。
參數(shù):
from:最匹配的結(jié)果中的文檔個(gè)數(shù)偏移;
size:top matching hits 返回的最大文檔個(gè)數(shù)(default 3);
sort:最匹配的文檔的排序方式。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值。
GET /lib4/items/_search
{
??? "size": 0, # 表示查詢(xún)多少條文檔,聚合只需就和結(jié)果,輸出文檔可以設(shè)置為0條
??? "aggs": {
??????? "price_of_sum": { # 自行取名作為結(jié)果集
??????????? "sum": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
min 聚合(single)
min是一個(gè)求最小值的聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_min": {
??????????? "min": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
//最小值,script
{
?? ?"size", 0
??? "aggs" : {
??????? "price_of_min_script" : {
??????????? "min" : {
??????????????? "script" : {??????????????? //script 計(jì)算 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是一個(gè)求最大值聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值。
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是一個(gè)求平均值的聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值。
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是一個(gè)求基數(shù)的聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
precision_threshold:精度閾值,用于處理準(zhǔn)確度問(wèn)題;
missing:文檔缺失字段時(shí)的默認(rèn)值。
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_cardi": {
??????????? "cardinality": { # 其實(shí)相當(dāng)于該字段互不相同的值有多少類(lèi),輸出的是種類(lèi)數(shù)
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
1
2
3
4
5
6
7
8
9
10
11
stats 聚合(multi-value)
統(tǒng)計(jì)聚合,基于文檔的某個(gè)值,計(jì)算出一些統(tǒng)計(jì)信息(min、max、sum、count、avg)。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值。
{
??? "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)
擴(kuò)展統(tǒng)計(jì)聚合,基于文檔的某個(gè)值,計(jì)算出一些統(tǒng)計(jì)信息(比普通的stats聚合多了sum_of_squares、variance、std_deviation、std_deviation_bounds)。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺失字段時(shí)的默認(rèn)值;
sigma:標(biāo)準(zhǔn)差界限。
{
??? ...
??? "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 聚合
地理邊界聚合,基于文檔的某個(gè)字段(geo-point類(lèi)型字段),計(jì)算出該字段所有地理坐標(biāo)點(diǎn)的邊界(左上角/右下角坐標(biāo)點(diǎn))。
參數(shù):
field:用于計(jì)算的字段;
wrap_longitude:是否允許地理邊界與國(guó)際日界線存在重疊。
{
??? "query" : {
??????? "match" : { "business_type" : "shop" }
??? },
??? "aggs" : {
??????? "viewport" : {
??????????? "geo_bounds" : {
??????????????? "field" : "location",
??????????????? "wrap_longitude" : true
??????????? }
??????? }
??? }
}
//輸出
{
??? ...
??? "aggregations": {
??????? "viewport": {
??????????? "bounds": {
??????????????? "top_left": {??????????????????? //左上角經(jīng)緯度
??????????????????? "lat": 80.45,
??????????????????? "lon": -160.22
??????????????? },
??????????????? "bottom_right": {?????????????? //右下角經(jīng)緯度
??????????????????? "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 聚合
地理重心聚合,基于文檔的某個(gè)字段(geo-point類(lèi)型字段),計(jì)算所有坐標(biāo)的加權(quán)重心。
參數(shù):
field:用于計(jì)算的字段(geo-point類(lèi)型)。
{
??? "query" : {
??????? "match" : { "crime" : "burglary" }
??? },
??? "aggs" : {
??????? "centroid" : {
??????????? "geo_centroid" : {
??????????????? "field" : "location"
??????????? }
??????? }
??? }
}
//輸出
{
??? ...
??? "aggregations": {
??????? "centroid": {
??????????? "location": {????? //重心經(jīng)緯度
??????????????? "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)
百分百聚合,基于聚合文檔中某個(gè)數(shù)值類(lèi)型的值,求這些值中。
參數(shù):
field:用于計(jì)算的字段;
script:由腳本生成用來(lái)計(jì)算的 value;
missing:文檔缺省字段時(shí)的默認(rèn)。
Script Metric 聚合
基于腳本的權(quán)值聚合,用腳本來(lái)計(jì)算出一個(gè)權(quán)值。
參數(shù):
init_script:用于計(jì)算的字段;
map_script:由腳本生成用來(lái)計(jì)算的 value;
combine_script:文檔缺省字段時(shí)的默認(rèn)值;
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 聚合
最高匹配權(quán)值聚合,跟蹤聚合中相關(guān)性最高的文檔。
該聚合一般用做 sub-aggregation,以此來(lái)聚合每個(gè)桶中的最高匹配的文檔。
參數(shù):
from:最匹配的結(jié)果中的文檔個(gè)數(shù)偏移;
size:top matching hits 返回的最大文檔個(gè)數(shù)(default 3);
sort:最匹配的文檔的排序方式。
{
??? "aggs": {
??????? "top-tags": {
??????????? "terms": {
??????????????? "field": "tags",
??????????????? "size": 3
??????????? },
??????????? "aggs": {
??????????????? "top_tag_hits": {
??????????????????? "top_hits": {????????????????? //用 tags 字段分組,每個(gè) tag(即一個(gè)分組)只顯示最后一個(gè)問(wèn)題,并且只在 _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)
值計(jì)數(shù)聚合,計(jì)算聚合文檔中某個(gè)值的個(gè)數(shù)。
用于計(jì)數(shù)的值可以是特定的數(shù)值型字段,也可以通過(guò)腳本計(jì)算而來(lái)。
該聚合一般域其它 single-value 聚合聯(lián)合使用,比如在計(jì)算一個(gè)字段的平均值的時(shí)候,可能還會(huì)關(guān)注這個(gè)平均值是由多少個(gè)值計(jì)算而來(lái)。
參數(shù):
field:用于計(jì)算的字段
script:由腳本生成用來(lái)計(jì)算的 value
{
??? "aggs" : {
??????? "grades_count" : {
?????? ??? ?"value_count" : {
?????? ??? ??? ?"field" : "grade"
?????? ??? ?}
??????? }??? //計(jì)算 grade 字段共有多少個(gè)值,和 cardinality 聚合不同的
??? }
}
1
2
3
4
5
6
7
8
9
桶聚合查詢(xún)
histogram 聚合(multi-bucket)
直方圖聚合,基于文檔中的某個(gè)【數(shù)值類(lèi)型】字段,通過(guò)計(jì)算來(lái)動(dòng)態(tài)的分桶。
計(jì)算如下:
rem = value % interval
if (rem < 0) {
??? rem += interval
}
bucket_key = value - rem
1
2
3
4
5
參數(shù):
field:字段,必須為數(shù)值類(lèi)型
interval:分桶間距
min_doc_count:最少文檔數(shù)桶過(guò)濾,只有不少于這么多文檔的桶才會(huì)返回
extended_bounds:范圍擴(kuò)展
order:對(duì)桶排序,如果 histogram 聚合有一個(gè)權(quán)值聚合類(lèi)型的"直接"子聚合,那么排序可以使用子聚合中的結(jié)果
offset:桶邊界位移,默認(rèn)從0開(kāi)始
keyed:hash結(jié)構(gòu)返回,默認(rèn)以數(shù)組形式返回每一個(gè)桶
missing:配置缺省默認(rèn)值
{
??? "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)
日期直方圖聚合——基于日期類(lèi)型,以【日期間隔】來(lái)桶分聚合。
可用的時(shí)間間隔類(lèi)型為:
year、quarter、month、week、day、hour、minute、second
其中,除了year、quarter 和 month,其余可用小數(shù)形式。
參數(shù):
field:字段,必須為數(shù)值類(lèi)型
interval:分桶間距
format:定義日期的格式,配置后會(huì)返回一個(gè) key_as_string 的字符串類(lèi)型日期(默認(rèn)只有key)
time_zone:定義時(shí)區(qū),用作時(shí)間值的調(diào)整
offset:桶邊界位移,默認(rèn)從0開(kāi)始
missing:配置缺省默認(rèn)值
{
??? "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)
范圍聚合——基于某個(gè)值(可以是 field 或 script),以【字段范圍】來(lái)桶分聚合。
范圍聚合包括 from 值,不包括 to 值(區(qū)間前閉后開(kāi))。
參數(shù):
ranges:配置區(qū)間,數(shù)組,每一個(gè)元素是一個(gè)區(qū)間。例如:[{from:0}, {from:50, to:100}, {to:200}]
keyed:以一個(gè)關(guān)聯(lián)的唯一字符串作為鍵,以 HASH 形式返回,而不是默認(rèn)的數(shù)組
script:利用 script 執(zhí)行結(jié)果替代普通的 field 值進(jìn)行聚合。script可以用file給出,還可以對(duì)其它 field 進(jìn)行求值計(jì)算。
{
??? "aggs" : {
??????? "price_ranges" : {
??????????? "range" : {
??????????????? "field" : "price",
??????????????? "ranges" : [?????????????????????? //包含 3 個(gè)桶
??????????????????? { "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)
日期范圍聚合,基于日期類(lèi)型的值,以【日期范圍】來(lái)桶分聚合。
日期范圍可以用各種 Date Math 表達(dá)式。
同樣的,包括 from 的值,不包括 to 的值。
參數(shù):
format:定義日期格式,配置后會(huì)返回一個(gè) [to/from]_as_string 的字符串類(lèi)型日期,默認(rèn)是 to/from 的數(shù)值表示。
{
??? "aggs": {
??????? "range": {
??????????? "date_range": {
??????????????? "field": "date",
??????????????? "format": "MM-yyy",????????????? ?
??????????????? "ranges": [??????????????????????????? //包含 3 個(gè)桶
??????????????????? { "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是一個(gè)分組聚合,其作用與關(guān)系型數(shù)據(jù)庫(kù)中相同。
默認(rèn)返回順序是按照文檔個(gè)數(shù)多少排序。
當(dāng)不返回所有 buckets 的情況,文檔個(gè)數(shù)可能不準(zhǔn)確
參數(shù):
size:size用來(lái)定義需要返回多個(gè) buckets(防止太多),默認(rèn)會(huì)全部返回。(注意,如果只返回部分buckets,統(tǒng)計(jì)的文檔個(gè)數(shù)不一定準(zhǔn)確(每個(gè)分片各自的top size個(gè))。size 越大,count 會(huì)越精確。)
order:排序方式
min_doc_count:只返回文檔個(gè)數(shù)不小于該值的 buckets
script:用基本來(lái)生成詞元
include:包含過(guò)濾
exclude:排除過(guò)濾
execution_hint:
collect_mode:
missing:配置缺省默認(rèn)值
GET /lib4/items/_search
{
??? "size": 0,
??? "aggs": {
??????? "price_of_by": {
??????????? "terms": {
??????????????? "field": "price"
??????????? }
??????? }
??? }
}
# 對(duì)那些有唱歌興趣的用戶(hù)按年齡分組
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)
多過(guò)濾聚合,基于多個(gè)過(guò)濾條件,來(lái)對(duì)當(dāng)前文檔進(jìn)行【過(guò)濾】的聚合,每個(gè)過(guò)濾都包含所有滿(mǎn)足它的文檔(多個(gè)bucket中可能重復(fù))。
參數(shù):
filters: 配置過(guò)濾條件,支持 HASH 或 數(shù)組格式
other_bucket: 是否計(jì)算不滿(mǎn)足任何匹配條件的文檔
other_bucket_key: 作為不匹配所有過(guò)濾條件的文檔的 bucket 名稱(chēng)
{
? "aggs" : {
??? "messages" : {
????? "filters" : {
??????? "other_bucket_key": "other_messages",??????????????? //不在過(guò)濾條件范圍內(nèi)的文檔都?xì)w屬于 other_messages 桶
??????? "filters" : {??????????????????????????????????????? //過(guò)濾條件
????????? "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)
過(guò)濾聚合,基于一個(gè)條件,來(lái)對(duì)當(dāng)前的文檔進(jìn)行過(guò)濾的聚合。
{
??? "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聚合——基于一個(gè) IPv4 字段,對(duì)文檔進(jìn)行【IPv4范圍】的桶分聚合。
和 Range Aggregation 類(lèi)似,只是應(yīng)用字段必須是 IPv4 數(shù)據(jù)類(lèi)型。
{
??? "aggs" : {
??????? "ip_ranges" : {
??????????? "ip_range" : {
??????????????? "field" : "ip",
??????????????? "ranges" : [??????????????????????????????? //包含 3 個(gè)桶,各個(gè)桶之間可能有文檔重復(fù)
??????????????????? { "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)
嵌套類(lèi)型聚合,基于嵌套(nested)數(shù)據(jù)類(lèi)型,把該【嵌套類(lèi)型的信息】聚合到單個(gè)桶里,然后就可以對(duì)嵌套類(lèi)型做進(jìn)一步的聚合操作。
// resellers 是一個(gè)嵌套類(lèi)型
{
??? ...
??? "product" : {
??????? "properties" : {
??????????? "resellers" : {
??????????????? "type" : "nested",
??????????????? "properties" : {
??????????????????? "name" : { "type" : "string" },
??????????????????? "price" : { "type" : "double" }
??????????????? }
??????????? }
??????? }
??? }
}
// 對(duì) nested 對(duì)象里面的信息做其它聚合操作
{
??? "query" : {
??????? "match" : { "name" : "led tv" }
??? },
??? "aggs" : {
??????? "resellers" : {
??????????? "nested" : {?????????????????????????? //"嵌套類(lèi)型聚合"把所有嵌套信息都包含在單一的桶里,以供進(jìn)一步處理
??????????????? "path" : "resellers"
??????????? },
??????????? "aggs" : {
??????????????? "min_price" : { "min" : { "field" : "resellers.price" } }?? //對(duì)嵌套類(lèi)型聚合輸出的桶做進(jìn)一步處理,這里是計(jì)算其 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
管道聚合
管道聚合處理的對(duì)象是其它聚合的輸出(桶或者桶的某些權(quán)值),而不是直接針對(duì)文檔。
管道聚合的作用是為輸出增加一些有用信息。
管道聚合大致分為兩類(lèi):
parent
此類(lèi)聚合的"輸入"是其【父聚合】的輸出,并對(duì)其進(jìn)行進(jìn)一步處理。一般不生成新的桶,而是對(duì)父聚合桶信息的增強(qiáng)。
sibling
此類(lèi)聚合的輸入是其【兄弟聚合】的輸出。并能在同級(jí)上計(jì)算新的聚合。
管道聚合通過(guò) buckets_path 參數(shù)指定他們要進(jìn)行聚合計(jì)算的權(quán)值對(duì)象,buckets_path 參數(shù)有其自己的使用語(yǔ)法。
管道聚合不能包含子聚合,但是某些類(lèi)型的管道聚合可以鏈?zhǔn)绞褂?#xff08;比如計(jì)算導(dǎo)數(shù)的導(dǎo)數(shù))。
bucket_path語(yǔ)法
聚合分隔符 ==> “>”,指定父子聚合關(guān)系,如:“my_bucket>my_stats.avg”
權(quán)值分隔符 ==> “.”,指定聚合的特定權(quán)值
聚合名稱(chēng) ==> ,直接指定聚合的名稱(chēng)
權(quán)值 ==> ,直接指定權(quán)值
完整路徑 ==> agg_name[> agg_name]*[. metrics] ,綜合利用上面的方式指定完整路徑
特殊值 ==> “_count”,輸入的文檔個(gè)數(shù)
特殊情況
要進(jìn)行 pipeline aggregation 聚合的對(duì)象名稱(chēng)或權(quán)值名稱(chēng)包含小數(shù)點(diǎn)
“buckets_path”: “my_percentile[99.9]”
處理對(duì)象中包含空桶(無(wú)文檔的桶分)
參數(shù) gap_policy,可選值有 skip、insert_zeros
Avg Bucket 聚合(sibliing)
桶均值聚合,基于兄弟聚合的某個(gè)權(quán)值,求所有桶的權(quán)值均值。
用于計(jì)算的兄弟聚合必須是多桶聚合。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
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": {???????????? //對(duì)所有月份的銷(xiāo)售總 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)
求導(dǎo)聚合,基于父聚合(只能是histogram或date_histogram類(lèi)型)的某個(gè)權(quán)值,對(duì)權(quán)值求導(dǎo)。
用于求導(dǎo)的權(quán)值必須是數(shù)值類(lèi)型。
封閉直方圖(histogram)聚合的 min_doc_count 必須是 0。
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? },
??????????????? "sales_deriv": {?????? //對(duì)每個(gè)月銷(xiāo)售總和 sales 求導(dǎo)
??????????????????? "derivative": {
??????????????????????? "buckets_path": "sales"? //同級(jí),直接用 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)
桶最大值聚合,基于兄弟聚合的某個(gè)權(quán)值,輸出權(quán)值最大的那一個(gè)桶。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
Min Bucket 聚合(sibling)
桶最小值聚合,基于兄弟聚合的某個(gè)權(quán)值,輸出權(quán)值最小的一個(gè)桶。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
參數(shù)
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
Sum Buchet 聚合(sibling)
桶求和聚合,基于兄弟聚合的權(quán)值,對(duì)所有桶的權(quán)值求和。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
參數(shù)
buckets_path:用于計(jì)算均值的權(quán)值路徑
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 的每月銷(xiāo)售總和 sales 的最大一個(gè)桶
??????????? "max_bucket": {
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? },
??????? "min_monthly_sales": {???????? //輸出兄弟聚合 sales_per_month 的每月銷(xiāo)售總和 sales 的最小一個(gè)桶
??????????? "min_bucket": {
??????????????? "buckets_path": "sales_per_month>sales"
??????????? }
??????? },
??????? "sum_monthly_sales": {???????? //輸出兄弟聚合 sales_per_month 的每月銷(xiāo)售總和 sales 的最小一個(gè)桶
??????????? "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)
桶統(tǒng)計(jì)信息聚合,基于兄弟聚合的某個(gè)權(quán)值,對(duì)【桶的信息】進(jìn)行一些統(tǒng)計(jì)學(xué)運(yùn)算(總計(jì)多少個(gè)桶、所有桶中該權(quán)值的最大值、最小等)。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
參數(shù)
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
{
??? "aggs" : {
??????? "sales_per_month" : {
??????????? "date_histogram" : {
??????????????? "field" : "date",
??????????????? "interval" : "month"
??????????? },
??????????? "aggs": {
??????????????? "sales": {
??????????????????? "sum": {
??????????????????????? "field": "price"
??????????????????? }
??????????????? }
??????????? }
??????? },
??????? "stats_monthly_sales": {?????????????? // 對(duì)父聚合的每個(gè)桶(每月銷(xiāo)售總和)的一些基本信息進(jìn)行聚合
??????????? "stats_bucket": {
??????????????? "buckets_paths": "sales_per_month>sales"
??????????? }
??????? }
??? }
}
//輸出結(jié)果
{
?? "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": {??????? //注意,統(tǒng)計(jì)的是桶的信息
???????? "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)**
擴(kuò)展桶統(tǒng)計(jì)聚合,基于兄弟聚合的某個(gè)權(quán)值,對(duì)【桶信息】進(jìn)行一系列統(tǒng)計(jì)學(xué)計(jì)算(比普通的統(tǒng)計(jì)聚合多了一些統(tǒng)計(jì)值)。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
參數(shù)
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
sigma:偏差顯示位置(above/below)
** Percentiles Bucket 聚合(sibling)**
桶百分比聚合,基于兄弟聚合的某個(gè)權(quán)值,計(jì)算權(quán)值的百分百。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
用于計(jì)算的兄弟聚合必須是多桶聚合類(lèi)型。
對(duì)百分百的計(jì)算是精確的(不像Percentiles Metric聚合是近似值),所以可能會(huì)消耗大量?jī)?nèi)存
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
format:該聚合的輸出格式定義
percents:需要計(jì)算的百分百列表(數(shù)組形式)
Moving Average 聚合(parent)
窗口平均值聚合,基于已經(jīng)排序過(guò)的數(shù)據(jù),計(jì)算出處在當(dāng)前出口中數(shù)據(jù)的平均值。
比如窗口大小為 5 ,對(duì)數(shù)據(jù) 1—10 的部分窗口平均值如下:
(1 + 2 + 3 + 4 + 5) / 5 = 3
(2 + 3 + 4 + 5 + 6) / 5 = 4
(3 + 4 + 5 + 6 + 7) / 5 = 5
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
gap_policy:空桶處理策略(skip/insert_zeros)
window:窗口大小
model:移動(dòng)模型
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)
累計(jì)和聚合,基于父聚合(只能是histogram或date_histogram類(lèi)型)的某個(gè)權(quán)值,對(duì)權(quán)值在每一個(gè)桶中求所有之前的桶的該值累計(jì)的和。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
封閉直方圖(histogram)聚合的 min_doc_count 必須是 0。
參數(shù):
buckets_path:用于計(jì)算均值的權(quán)值路徑
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??????????????? //總計(jì) sales = 550
?????????????? }
??????????? },
??????????? {
?????????????? "key_as_string": "2015/02/01 00:00:00",
?????????????? "key": 1422748800000,
?????????????? "doc_count": 2,
?????????????? "sales": {
????????????????? "value": 60
?????????????? },
?????????????? "cumulative_sales": {
????????????????? "value": 610?????????????? //總計(jì) 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)**
桶腳本聚合,基于父聚合的【一個(gè)或多個(gè)權(quán)值】,對(duì)這些權(quán)值通過(guò)腳本進(jìn)行運(yùn)算。
用于計(jì)算的父聚合必須是多桶聚合。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
執(zhí)行腳本必須要返回?cái)?shù)值型結(jié)果。
參數(shù)
script:用于計(jì)算的腳本,腳本可以是 inline,也可以是 file,還可以是 Scripting 指定的
buckets_path:用于計(jì)算均值的權(quán)值路徑
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": {??????????????????? //對(duì)兩個(gè)權(quán)值進(jìn)行計(jì)算
????????????????????????? "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)
桶選擇器聚合,基于父聚合的【一個(gè)或多個(gè)權(quán)值】,通過(guò)腳本對(duì)權(quán)值進(jìn)行計(jì)算,并決定父聚合的哪些桶需要保留,其余的將被丟棄。
用于計(jì)算的父聚合必須是多桶聚合。
用于計(jì)算的權(quán)值必須是數(shù)值類(lèi)型。
運(yùn)算的腳本必須是返回 boolean 類(lèi)型,如果腳本是腳本表達(dá)式形式給出,那么允許返回?cái)?shù)值類(lèi)型。
參數(shù):
script:用于計(jì)算的腳本,腳本可以是 inline,也可以是 file,還可以是 Scripting 指定的
buckets_path:用于計(jì)算均值的權(quán)值路徑
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類(lèi)型)的某個(gè)權(quán)值,對(duì)權(quán)值值進(jìn)行差分運(yùn)算,(取時(shí)間間隔,后一刻的值減去前一刻的值:f(X) = f(Xt) – f(Xt-n))。
用于計(jì)算的父聚合必須是多桶聚合。
參數(shù)
lag:滯后間隔(比如lag=7,表示每次從當(dāng)前桶的值中減去其前面第7個(gè)桶的值)
buckets_path:用于計(jì)算均值的權(quán)值路徑
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
復(fù)合查詢(xún)
使用bool查詢(xún)
接受以下參數(shù):
must:文檔必須匹配設(shè)定條件才能被包含進(jìn)來(lái)
must_not:文檔必須不匹配設(shè)定條件才能被包含進(jìn)來(lái)
should:如果滿(mǎn)足語(yǔ)句中的任意語(yǔ)句,將增加_source,否則,無(wú)任何影響。主要用于修正每個(gè)文檔的相關(guān)性得分
filter:必須匹配,但以不評(píng)分、過(guò)濾模式來(lái)進(jìn)行。這些語(yǔ)句對(duì)評(píng)分沒(méi)有貢獻(xiàn),只是根據(jù)過(guò)濾標(biāo)準(zhǔn)來(lái)排除或包含文檔
相關(guān)性得分是如何組合的?
每一個(gè)子查詢(xún)都獨(dú)自的計(jì)算文檔的相關(guān)性得分,bool查詢(xún)將對(duì)計(jì)算出的等分進(jìn)行合并,然后返回一個(gè)代表整個(gè)布爾操作的等分。
下面的查詢(xún)用于查找title字段匹配 how to make millions 并且不被標(biāo)識(shí)為 spam的文檔。那些被標(biāo)識(shí)為 starred 或在2014之后的文檔,將比另外那些文檔擁有更高的排名。如果 兩者 都滿(mǎn)足,那么它的排名將更高。
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
如果沒(méi)有 must 語(yǔ)句,那么至少需要能夠匹配其中的一條 should 語(yǔ)句。但如果存在至少一條 must 語(yǔ)句,則對(duì) should 語(yǔ)句的匹配沒(méi)有要求。如果不想因?yàn)槲臋n的時(shí)間影響得分,可以用 filter 語(yǔ)句來(lái)重寫(xiě)前面的例子
# 可以在bool內(nèi)嵌套filter過(guò)濾
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
通過(guò)將 range 查詢(xún)移動(dòng)到 filter 語(yǔ)句中,我們將它轉(zhuǎn)成不評(píng)分的查詢(xún),將不在影響文檔的相關(guān)性排名,由于它現(xiàn)在是一個(gè)不評(píng)分的查詢(xún),可以使用各種對(duì) filter 查詢(xún)有效的優(yōu)化手段來(lái)提升性能。
bool 查詢(xún)本身也可以被用作不評(píng)分的查詢(xún),簡(jiǎn)單的將它放置到 filter 語(yǔ)句中并在內(nèi)部構(gòu)建布爾邏輯
# 在bool內(nèi)嵌套fliter,在fliter下嵌套另一個(gè)bool作為過(guò)濾條件
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查詢(xún)
constant_score將一個(gè)不變的量評(píng)分應(yīng)用于所有匹配的文檔,被經(jīng)常用于你只需要執(zhí)行一個(gè) fliter 而沒(méi)有其他查詢(xún)(例如:評(píng)分查詢(xún))的情況下。
請(qǐng)求結(jié)構(gòu)如下:
{
?? ?"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 查詢(xún)被放置在constant_score中,轉(zhuǎn)成不評(píng)分的 filter。這種方式可以用來(lái)取代只有 filter 語(yǔ)句的 bool 查詢(xún)。
————————————————
版權(quán)聲明:本文為CSDN博主「迷途碼界」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zx711166/article/details/81906881
總結(jié)
以上是生活随笔為你收集整理的(转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑硬盘资料备份方法(怎么备份电脑硬盘的
- 下一篇: (转)es 聚合查询并返回每个组的数据