elasticsearch7.6文檔解析-avg聚合

文檔格式如下:

{
                    
                    "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來參與平均運算

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章