文檔格式如下:
{
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "[email protected]",
"city": "Brogan",
"state": "IL"
}
現在我們求age的平均值:
方法1:
POST /exams/_search?size=0
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "age" } }
}
}
方法2:
POST /exams/_search?size=0
{
"aggs" : {
"avg_grade" : {
"avg" : {
"script" : {
"source" : "doc.grade.value"
}
}
}
}
}
方法3:腳本寫在內部:
先看官方示例:
POST /exams/_search?size=0
{
"aggs" : {
"avg_corrected_grade" : {
"avg" : {
"field" : "grade",
"script" : {
"lang": "painless",
"source": "_value * params.correction",
"params" : {
"correction" : 1.2
}
}
}
}
}
}
這個示例可以瞭解它是怎麼向內部腳本傳參的。些處外部參數(內部腳本或者儲存的腳本里都一樣)在腳本里用params.key的形式來訪問。
{
"size":1,
"aggs":{
"average_balance":{
"avg":{
"field":"age",
"script":{
"lang":"painless",
"source":"_value*2"//這裏可以對結果進行一定運算
}
}
}
}
}
方法4,就是用儲存的腳本.
step1:
我們先創建一個腳本:
post 127.0.0.1:9200/_scripts/my_script2
{
"script":{
"lang":"painless",
"source":"doc['age'].value*2"
}
}
多字段的情況下:
{
"script":{
"lang":"painless",
"source":"doc['balance'].value+doc['age'].value*2"
}
}
step2 然後指定腳本:
{
"size":1,
"aggs":{
"average_balance":{
"avg":{
"script":{
"id": "my_script2",
"params":{
"field":"age,balance"
}
}
}
}
}
}
還有一種情況,假設當中有一個文檔沒有age這個字段,我們這樣處理:
POST /exams/_search?size=0
{
"aggs" : {
"grade_avg" : {
"avg" : {
"field" : "grade",
"missing": 10
}
}
}
}
就是當它沒有這個字段時就給它個默認值10來參與平均運算