es avg aggregation - yaokun123/php-wiki GitHub Wiki

一、Avg Aggregation平均聚合

平均聚合的聚合类型是avg

一个单值度量聚合,计算从聚合文档中提取的数值的平均值。这些值可以从文档中的特定数字字段提取,也可以由提供的脚本生成

从文档中的特定数字字段提取

GET company_es/_search
{
  "aggs": {
    "avg_capital_number": {//这个名字是自己随便取的
      "avg": {//聚合类型是avg(平均数)
        "field": "capitalNumber"//单值聚合
      }
    }
  }
}

------------------------------返回文档如下---------------------------------------
...
"aggregations" : {
    "avg_capital_number" : {//这个名字是搜索的时候定义的
      "value" : 454.9986790682733
    }
  }


缺少参数定义了应该如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值
GET company_es/_search
{
  "aggs": {
    "avg_capital_number": {
      "avg": {
        "field": "capitalNumber"
        "missing": 10//缺少值处理
      }
    }
  }
}

基于脚本计算平均分数

GET company_es/_search
{
  "aggs": {
    "avg_capital_number": {
      "avg": {
        "script": {
          "source": "doc.capitalNumber.value"
        }
      }
    }
  }
}

------------------------------返回文档如下---------------------------------------
...
"aggregations" : {
    "avg_capital_number" : {
      "value" : 454.9986790682733
    }
  }


这将把脚本参数解释为内联脚本,使用简单的脚本语言,没有脚本参数。要使用存储的脚本,请使用以下语法
GET company_es/_search
{
  "aggs": {
    "avg_capital_number": {
      "avg": {
        "script": {
          "id":"my_script",//存储的脚本id,
          "params":{
            "field": "capitalNumber"
          }
        }
      }
    }
  }
}

对分数进行修正,我们可以使用值脚本来得到新的平均值
GET company_es/_search
{
  "aggs": {
    "avg_capital_number": {
      "avg": {
        "field": "capitalNumber",
        "script": {
          "lang": "painless",
          "source": "_value * params.correction",
          "params":{
            "correction" : 1.2
          }
        }
      }
    }
  }
}

二、Weighted Avg Aggregationedit加权平均聚合

在计算常规平均值时,每个数据点具有相等的“权重”……它对最终值的贡献相等。另一方面,加权平均数对每个数据点的权重不同。每个数据点对最终值的贡献是从文档中提取出来的,或者由脚本提供。

一个普通的平均值可以被认为是一个加权平均值,其中每个值的隐含权值为1

如果我们的文档有一个包含0-100数字分数的“grade”字段和一个包含任意数字权重的“weight”字段,那么我们可以使用下面的方法计算加权平均值

GET company_es/_search
{
  "aggs": {
    "weighted_avg_capital_number": {
      "weighted_avg":{
        "value":{
          "field": "capitalNumber"//主要聚合字段
        },
        "weight":{
          "field":"cid"//用来加权的字段
        }
      }
    }
  }
}

------------------------------返回文档如下---------------------------------------
"aggregations" : {
    "weighted_avg_capital_number" : {
      "value" : 769.8884338776376
    }
  }

虽然每个字段允许多个值,但是只允许一个权重。如果聚合遇到一个文档有多个权值(例如,权值字段是一个多值字段),它将抛出一个异常。如果您遇到这种情况,您将需要为weight字段指定一个脚本,并使用该脚本将多个值组合成一个要使用的值

此单一权重将独立应用于从value字段中提取的每个值

值和权重都可以从脚本而不是字段派生。

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "script": "doc.grade.value + 1"
                },
                "weight": {
                    "script": "doc.weight.value + 1"
                }
            }
        }
    }
}

缺少参数定义了应该如何处理缺少值的文档。值和权重的默认行为不同。默认情况下,如果缺少值字段,则忽略文档,聚合将转移到下一个文档。如果缺少权值字段,则假定其权值为1(与正常平均值一样)。可以使用缺少的参数覆盖这两个缺省值

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade",
                    "missing": 2
                },
                "weight": {
                    "field": "weight",
                    "missing": 3
                }
            }
        }
    }
}