指标聚合(Metrics Aggregations)一个是以各种方式(in one way or another)从正在参与聚合的文档中提取值进行指标计算的聚合分析家族。这些值通常从文档的字段中提取,或是由脚本生成。
数值型指标聚合一种输出数值的特定类型的指标聚合,输出一个数值的聚合称为single-value numeric metrics aggregation(单一数值指标聚合),生成多个数值的聚合称之为mult-value numeric metrics aggregation(多数值指标聚合)。这两种聚合在参与子聚合的时候才会有不同的作用和区别。
Avg聚合
Avg聚合是对满足条件文档提取的值(文档的字段值或是脚本生成的值)进行平均值运算。
可以对所有的数值类型的文档进行平均值聚合操作。
当我们需要对查询结果中的数值进行平均值统计的时候,可以用Avg聚合。
POST /exams/_search?size=0
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "grade" } }
}
}
这个例子中是对exams索引中的所有文档的“grade”字段进行平均值计算。
返回结果输出了满足条件的文档的平均值
{
...
"aggregations": {
"avg_grade": {
"value": 75.0
}
}
}
对查询结果进行平均值统计
在查询体中,aggregation和query进行组合,就是对查询结果进行聚合分析。
比如
GET /test_shape/_search/
{
"query": {
"match": {
"ydxz":{
"query":"一类工业用地",
"operator":"and"
}
}
},
"from":0,
"size":1,
"aggs" : {
"avg_ydmj" : { "avg" : { "field" : "ydmj" } }
}
}
是对test_shape索引中,所有满足“ydxz”字段的值中含有“一类工业用地”的文档,对其“ydxz”字段进行平均值统计。
返回结果为:
耗时31ms,共查到1509个目标文档,这些文档的“ydxz”的平均值为9.14321407891015。
基于脚本生成的值进行平均值统计
avg聚合的计算因子可以是文档的字段,也可以是基于某一脚本生成。这些脚本是基于painless脚本语言编写。
在下面的例子中,“script”参数被解析成一个painless脚本语言编写的没有脚本参数的内联脚本。
POST /test_shape/_search?size=0
{
"aggs" : {
"avg_ydmj" : {
"avg" : {
"script" : {
"source" : "doc.ydmj.value"
}
}
}
}
}
使用存储的脚本生成的值计算平均值
在聚合体中使用存储的脚本之前,先要在集群的状态中增加脚本内容,然后通过ID进行调用。如下面的例子,创建了ID为“my_script”的脚本:
PUT _scripts/my_script
{
"script": {
"lang": "painless",
"source": "params.field"
}
然后在聚合体中引用该脚本文件:
POST /test_shape/_search?size=0
{
"aggs" : {
"avg_ydmj" : {
"avg" : {
"script" : {
"id": "my_script",
"params": {
"field": "ydmj"
}
}
}
}
}
}
使用值脚本生成的值计算平均值
我们也可以用value script(值脚本)生成的值来计算平均值
POST /test_shape/_search?size=0
{
"aggs" : {
"avg_corrected_ydmj" : {
"avg" : {
"field" : "ydmj",
"script" : {
"lang": "painless",
"source": "_value * params.correction",
"params" : {
"correction" : 1.2
}
}
}
}
}
}
利用“params”定义脚本中的需要的参数时,只能为数值(number)、日期(date)、布尔(boolean)类型
缺省值
avg聚合体中的missing产生用以定义满足条件的文档中,如果指定的字段没有值时的替代值。默认情况下,这个参数时忽略的,但是如果该参数有值,则会被采用。
POST /test_shape/_search?size=0
{
"aggs" : {
"grade_ydmj" : {
"avg" : {
"field" : "ydmj",
"missing": 10
}
}
}
}
上面的例子表示,"ydmj"的字段没有值时,用10代替。
注意:如果要对文档中的多个不同的字段计算平均值,通过在aggs聚合体中定义多个avg聚合操作来实现。