上一篇我們學(xué)習(xí)了使用 RESTful API 進(jìn)行常規(guī)查詢硼讽,這一篇我們來(lái)學(xué)習(xí)使用 RESTful API 進(jìn)行聚合查詢巢价,聚合查詢就是對(duì)文檔數(shù)據(jù)按照某些維度進(jìn)行統(tǒng)計(jì),如果你熟悉 MySql 的聚合查詢固阁,這個(gè)也就好理解了壤躲,這里先介紹一些常用的聚合查詢。
首先我們修改一下之前的文檔數(shù)據(jù)备燃,都添加school
字段碉克,例如:
POST user/_update/1
{
"doc": {
"school": "清華"
}
}
最終的文檔數(shù)據(jù)如下:
1、avg
avg
用來(lái)求平均值并齐,例如統(tǒng)計(jì)用戶的平均年齡:
GET user/_search
{
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
aggs
是固定的寫法漏麦,里邊可以包含多個(gè)統(tǒng)計(jì)維度客税;avg_age
相當(dāng)于統(tǒng)計(jì)結(jié)果的名稱,可以自定義撕贞;avg
表示求平均值的聚合操作更耻,也是固定寫法;field
表示對(duì)那個(gè)字段的值求平均值捏膨。
最終的結(jié)果如下:
2秧均、max
max
表示求最大值,如下統(tǒng)計(jì)最大年齡:
GET user/_search
{
"aggs": {
"max_age": {
"max": {
"field": "age"
}
}
}
}
3号涯、min
min
表示求最大值目胡,如下統(tǒng)計(jì)最小年齡:
GET user/_search
{
"aggs": {
"min_age": {
"min": {
"field": "age"
}
}
}
}
類似的還有sum
,這里就不介紹了链快。
4誉己、range
range
表示按區(qū)間統(tǒng)計(jì),比如指定時(shí)間范圍域蜗,指定大小區(qū)間等巫延;field
表示要統(tǒng)計(jì)的字段;ranges
里邊包含多個(gè)區(qū)間地消;from
表示區(qū)間的開(kāi)始,to
表示區(qū)間的結(jié)束畏妖;如下統(tǒng)計(jì)年齡在[0, 20]
脉执、[20, 40]
、[40, 100]
三個(gè)區(qū)間的人數(shù):
GET user/_search
{
"aggs": {
"range_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 0,
"to": 20
},
{
"from": 20,
"to": 40
},
{
"from": 40,
"to": 100
}
]
}
}
}
}
4戒劫、filter
filter
可以按指定的條件過(guò)濾數(shù)據(jù)半夷,如下統(tǒng)計(jì)姓王
的人數(shù):
GET user/_search
{
"aggs": {
"wang_name": {
"filter": {
"match_phrase_prefix": {
"name": "王"
}
}
}
}
}
5、terms
terms
可以實(shí)現(xiàn)按指定字段分組迅细,field
用來(lái)指定用哪個(gè)字段分組巫橄,size
表示統(tǒng)計(jì)出多少組數(shù)據(jù),order
表示各組數(shù)據(jù)如何排序茵典。如下實(shí)現(xiàn)按school
字段對(duì)數(shù)據(jù)進(jìn)行分組湘换,統(tǒng)計(jì)出10組數(shù)據(jù)即可,并按每組的數(shù)據(jù)量升序排列:
GET user/_search
{
"aggs": {
"group_school":{
"terms": {
"field": "school.keyword",
"size": 10,
"order": {
"_count": "asc"
}
}
}
}
}
這里有一點(diǎn)需要注意统阿,
school
后添加了.keyword
彩倚,如果不添加會(huì)產(chǎn)生如下的異常:
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [school] in order to load field data by uninverting the inverted index. Note that this can use significant memory.
大致的意思是,使用text
類型的字段數(shù)據(jù)進(jìn)行聚合扶平、排序時(shí)帆离,由于text
類型的字段未被 ES 優(yōu)化處理,所以無(wú)法進(jìn)行這些操作结澄「绻龋可以使用關(guān)鍵字字段來(lái)解決這個(gè)問(wèn)題岸夯,即在字段名后添加.keyword
∶峭祝或者設(shè)置school
字段設(shè)置fielddata=true
猜扮,但這樣這可能會(huì)占用大量?jī)?nèi)存,需要慎重王悍。
6破镰、子統(tǒng)計(jì)
上邊我們對(duì)數(shù)據(jù)按照school
字段進(jìn)行了分組,我們還可以統(tǒng)計(jì)組內(nèi)人員的最小年齡压储,這就是子統(tǒng)計(jì)鲜漩,如下:
GET user/_search
{
"aggs": {
"group_school":{
"terms": {
"field": "school.keyword",
"size": 10,
"order": {
"_key": "asc"
}
},
"aggs": {
"min_age": {
"min": {
"field": "age"
}
}
}
}
}
}
7、top_hits
top_hits
可以用來(lái)跟蹤正在聚合統(tǒng)計(jì)的相關(guān)文檔數(shù)據(jù)集惋。前邊介紹terms
時(shí)孕似,我們按school
字段對(duì)數(shù)據(jù)進(jìn)行了分組,但是我們還不知道組內(nèi)具體的文檔數(shù)據(jù)刮刑,現(xiàn)在我們使用top_hits
就可以看到每組內(nèi)具體的文檔數(shù)據(jù)喉祭, 如下:
GET user/_search
{
"aggs": {
"group_school": {
"terms": {
"field": "school.keyword",
"size": 10,
"order": {
"_count": "asc"
}
},
"aggs": {
"group_data": {
"top_hits": {
"size": 10
}
}
}
}
}
}
以下是統(tǒng)計(jì)結(jié)果的部分截圖:
先介紹這么多吧,后期看情況再補(bǔ)充雷绢。