Elasticsearch實戰(zhàn)-查詢query,filter過濾,結合aggs 進行局部/全局聚合統計
1.準備數據
POST /testcopy/_bulk
{"index":{"_id": 1}}
{"empId" : "111","name" : "員工1","age" : 20,"sex" : "男","mobile" : "19000001111","salary":1333,"deptName" : "技術部","provice" : "湖北省","city":"武漢","area":"光谷大道","address":"湖北省武漢市洪山區(qū)光谷大廈","content" : "i like to write best elasticsearch article"}
{"index":{"_id": 2}}
{"empId" : "222","name" : "員工2","age" : 25,"sex" : "男","mobile" : "19000002222","salary":15963,"deptName" : "銷售部","provice" : "湖北省","city":"武漢","area":"江漢區(qū)","address" : "湖北省武漢市江漢路","content" : "i think java is the best programming language"}
{"index":{"_id": 3}}
{ "empId" : "333","name" : "員工3","age" : 30,"sex" : "男","mobile" : "19000003333","salary":20000,"deptName" : "技術部","provice" : "湖北省","city":"武漢","area":"經濟技術開發(fā)區(qū)","address" : "湖北省武漢市經濟開發(fā)區(qū)","content" : "i am only an elasticsearch beginner"}
{"index":{"_id": 4}}
{"empId" : "444","name" : "員工4","age" : 20,"sex" : "女","mobile" : "19000004444","salary":5600,"deptName" : "銷售部","provice" : "湖北省","city":"武漢","area":"沌口開發(fā)區(qū)","address" : "湖北省武漢市沌口開發(fā)區(qū)","content" : "elasticsearch and hadoop are all very good solution, i am a beginner"}
{"index":{"_id": 5}}
{ "empId" : "555","name" : "員工5","age" : 20,"sex" : "男","mobile" : "19000005555","salary":9665,"deptName" : "測試部","provice" : "湖北省","city":"高新開發(fā)區(qū)","area":"武漢","address" : "湖北省武漢市東湖隧道","content" : "spark is best big data solution based on scala ,an programming language similar to java"}
{"index":{"_id": 6}}
{"empId" : "666","name" : "員工6","age" : 30,"sex" : "女","mobile" : "19000006666","salary":30000,"deptName" : "技術部","provice" : "武漢市","city":"湖北省","area":"江漢區(qū)","address" : "湖北省武漢市江漢路","content" : "i like java developer"}
{"index":{"_id": 7}}
{"empId" : "777","name" : "員工7","age" : 60,"sex" : "女","mobile" : "19000007777","salary":52130,"deptName" : "測試部","provice" : "湖北省","city":"黃岡市","area":"邊城區(qū)","address" : "湖北省黃岡市邊城區(qū)","content" : "i like elasticsearch developer"}
{"index":{"_id": 8}}
{"empId" : "888","name" : "員工8","age" : 19,"sex" : "女","mobile" : "19000008888","salary":60000,"deptName" : "技術部","provice" : "湖北省","city":"武漢","area":"漢陽區(qū)","address" : "湖北省武漢市江漢大學","content" : "i like spark language"}
{"index":{"_id": 9}}
{"empId" : "999","name" : "員工9","age" : 40,"sex" : "男","mobile" : "19000009999","salary":23000,"deptName" : "銷售部","provice" : "河南省","city":"鄭州市","area":"二七區(qū)","address" : "河南省鄭州市鄭州大學","content" : "i like java developer"}
{"index":{"_id": 10}}
{"empId" : "101010","name" : "張湖北","age" : 35,"sex" : "男","mobile" : "19000001010","salary":18000,"deptName" : "測試部","provice" : "湖北省","city":"武漢","area":"高新開發(fā)區(qū)","address" : "湖北省武漢市東湖高新","content" : "i like java developer i also like elasticsearch"}
{"index":{"_id": 11}}
{"empId" : "111111","name" : "王河南","age" : 61,"sex" : "男","mobile" : "19000001011","salary":10000,"deptName" : "銷售部",,"provice" : "河南省","city":"開封市","area":"金明區(qū)","address" : "河南省開封市河南大學","content" : "i am not like java "}
{"index":{"_id": 12}}
{"empId" : "121212","name" : "張大學","age" : 26,"sex" : "女","mobile" : "19000001012","salary":1321,"deptName" : "測試部",,"provice" : "河南省","city":"開封市","area":"金明區(qū)","address" : "河南省開封市河南大學","content" : "i am java developer thing java is good"}
{"index":{"_id": 13}}
{"empId" : "131313","name" : "李江漢","age" : 36,"sex" : "男","mobile" : "19000001013","salary":1125,"deptName" : "銷售部","provice" : "河南省","city":"鄭州市","area":"二七區(qū)","address" : "河南省鄭州市二七區(qū)","content" : "i like java and java is very best i like it do you like java "}
{"index":{"_id": 14}}
{"empId" : "141414","name" : "王技術","age" : 45,"sex" : "女","mobile" : "19000001014","salary":6222,"deptName" : "測試部",,"provice" : "河南省","city":"鄭州市","area":"金水區(qū)","address" : "河南省鄭州市金水區(qū)","content" : "i like c++"}
{"index":{"_id": 15}}
{"empId" : "151515","name" : "張測試","age" : 18,"sex" : "男","mobile" : "19000001015","salary":20000,"deptName" : "技術部",,"provice" : "河南省","city":"鄭州市","area":"高新開發(fā)區(qū)","address" : "河南省鄭州高新開發(fā)區(qū)","content" : "i think spark is good"}
2. ES 查詢query,filter過濾,結合aggs 聚合統計
2.1 查詢命中后,基于查詢的數據進行聚合
前面我們講的所有的聚合操作 都是沒有查詢的,都是上來直接 aggs 進行 聚合 avg, count, 如果現在我想統計 技術部的人 的平均年齡該如何實現?
實現 某個部門(技術部)的平均年齡的統計,先查詢然后基于查詢結果進行統計 技術部最大年齡,最小年齡,平均年齡
#query先查詢,然后基于查詢結果進行統計 max , min, avg
get /testcopy/_search
{
"query":{
"match_phrase": {
"deptName.keyword": "技術部"
}
},
//基于 query平級,進行aggs聚合操作,就是用query結果進行aggs聚合統計
"aggs":{
"tech_avg_age":{
"avg": {
"field": "age"
}
},
"max_age":{
"max": {
"field": "age"
}
},
"min_age":{
"min": {
"field": "age"
}
}
}
}
查詢結果 四個技術部員工, 是再查詢出來這四個員工的 基礎上 再次進行的統計分析
技術部 max age:30, min age:19, avg age:24.75
2.2 基于 filter 過濾后,基于此數據進行聚合
上面我們講了 基于 query的數據 進行 aggs 統計分析, 那是否能和 filter 結合來進行過濾呢? 當然可以!
實現 過濾 年齡在 (25,60)之間的人, 然后 基于這部分數據進行 平均年齡的統計
# 過濾 filter 過濾 25-40的人,然后 基于過濾結果進行統計 avg
get /testcopy/_search
{
"query":{
"bool": {
"filter": [
{
"range": {
"age": {
"gte": 25,
"lte": 40
}
}
}
]
}
},
"aggs":{
"avg_age":{
"avg": {
"field": "age"
}
}
}
}
查詢過濾 結果 6個技術部員工, 基于過濾基礎之上 再次進行的統計分析, 得出平均年齡 32.66
2.3 基于查詢query, filter 綜合過濾后,基于此數據進行聚合
上面我們講了 基于 query的數據 進行 aggs 統計分析, 那是否能和 filter 結合來進行過濾呢? 基于 查詢, 過濾后的數據進行統計分析 能否可行?
當然可以!
實現 查詢 技術部 過濾 年齡在 (25,60)之間的 :武漢的 然后 基于這部分數據進行 平均年齡的統計
#query先查詢,然后 filter 過濾 25-60的人,然后 基于查詢過濾結果進行統計 avg
get /testcopy/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"deptName.keyword": "技術部"
}
}
],
//must 平級 進行filter 過濾
"filter": [
{
"range": {
"age": {
"gte": 25,
"lte": 60
}
}
}
]
}
},
//query 結束, 平級 基于query查詢過濾結果 進行 aggs
"aggs":{
"avg_age":{
"avg": {
"field": "age"
}
}
}
}
查詢過濾 結果 2個技術部員工, 基于基礎之上 再次進行的統計分析, 得出平均年齡 30
3 Global bucket 全局bucket統計
3.1 局部bucket統計與全局global bucket統計
比如 現在 我想 部門的平均年齡和 所有整個公司的人的平均年齡的 來做對比,應該如何實現?分兩次查詢先查部門,然后查全部么,最后再做對比? 太麻煩了
- 不是這樣子的,ES提供了 global參數 來控制 全局統計, global定義了一個全局桶bucket
- Global 忽略查詢條件, 直接對所有document 數據進行統計
場景:
實現 某個部門的平均年齡和整個doc的平均年齡 的統計
#global:{} 在aggs 的分組名字內部, 就是忽略上面的查詢條件, 進行全局統計
get /testcopy/_search
{
"size":0,
"query":{
"match": {
"deptName.keyword": "技術部"
}
},
"aggs":{
"tech_avg":{
"avg": {
"field": "age"
}
},
//aggs內部 tech_avg 平級 進行全局統計 global bucket
"all_avg_age":{
"global": {},
"aggs": {
"all_of_age": {
"avg": {
"field": "age"
}
}
}
}
}
}
查詢結果 global 統計了11個doc, 然后 平均年齡30.45
單個技術部 有 4條數據doc,平均年齡是 24.75文章來源:http://www.zghlxwxcb.cn/news/detail-497612.html
至此 我們已經學習了 查詢query,filter過濾,結合aggs 進行局部/全局聚合統計的基本用法,實現了 查詢 query, filter過濾 及 融合aggs進行統計分析,及對比 局部/全局 global aggs 聚合統計, 下一篇,我們介紹下 TOP N 排名推薦文章來源地址http://www.zghlxwxcb.cn/news/detail-497612.html
到了這里,關于Elasticsearch實戰(zhàn)(十五)---查詢query,filter過濾,結合aggs 進行局部/全局聚合統計的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!