扩展统计聚合编辑

一种 多值 指标聚合,用于计算从聚合文档中提取的数值统计信息。

extended_stats 聚合是 stats 聚合的扩展版本,其中添加了其他指标,例如 sum_of_squaresvariancestd_deviationstd_deviation_bounds

假设数据由表示学生考试成绩(0 到 100 之间)的文档组成

response = client.search(
  index: 'exams',
  body: {
    size: 0,
    aggregations: {
      grades_stats: {
        extended_stats: {
          field: 'grade'
        }
      }
    }
  }
)
puts response
GET /exams/_search
{
  "size": 0,
  "aggs": {
    "grades_stats": { "extended_stats": { "field": "grade" } }
  }
}

上述聚合计算所有文档的成绩统计信息。聚合类型为 extended_statsfield 设置定义了将计算统计信息的文档的数值字段。以上将返回以下内容

std_deviationvariance 计算为总体指标,因此它们始终分别与 std_deviation_populationvariance_population 相同。

{
  ...

  "aggregations": {
    "grades_stats": {
      "count": 2,
      "min": 50.0,
      "max": 100.0,
      "avg": 75.0,
      "sum": 150.0,
      "sum_of_squares": 12500.0,
      "variance": 625.0,
      "variance_population": 625.0,
      "variance_sampling": 1250.0,
      "std_deviation": 25.0,
      "std_deviation_population": 25.0,
      "std_deviation_sampling": 35.35533905932738,
      "std_deviation_bounds": {
        "upper": 125.0,
        "lower": 25.0,
        "upper_population": 125.0,
        "lower_population": 25.0,
        "upper_sampling": 145.71067811865476,
        "lower_sampling": 4.289321881345245
      }
    }
  }
}

聚合的名称(上面的 grades_stats)也用作从返回的响应中检索聚合结果的键。

标准差边界编辑

默认情况下,extended_stats 指标将返回一个名为 std_deviation_bounds 的对象,该对象提供与平均值相差正负两个标准差的区间。这对于可视化数据的方差很有用。如果您想要不同的边界,例如三个标准差,则可以在请求中设置 sigma

response = client.search(
  index: 'exams',
  body: {
    size: 0,
    aggregations: {
      grades_stats: {
        extended_stats: {
          field: 'grade',
          sigma: 3
        }
      }
    }
  }
)
puts response
GET /exams/_search
{
  "size": 0,
  "aggs": {
    "grades_stats": {
      "extended_stats": {
        "field": "grade",
        "sigma": 3          
      }
    }
  }
}

sigma 控制应显示与平均值相差多少个标准差 +/-

sigma 可以是任何非负双精度数,这意味着您可以请求非整数值,例如 1.5。值 0 有效,但只会为 upperlower 边界返回平均值。

upperlower 边界计算为总体指标,因此它们始终分别与 upper_populationlower_population 相同。

标准差和边界需要正态性

标准差及其边界默认显示,但它们并不总是适用于所有数据集。您的数据必须呈正态分布,指标才有意义。标准差背后的统计数据假设数据呈正态分布,因此如果您的数据严重向左或向右倾斜,则返回值将具有误导性。

脚本编辑

如果需要聚合未编入索引的值,请使用 运行时字段。假设我们发现我们一直在处理的成绩是针对一项超出学生水平的考试,我们想对其进行“修正”

response = client.search(
  index: 'exams',
  body: {
    size: 0,
    runtime_mappings: {
      'grade.corrected' => {
        type: 'double',
        script: {
          source: "emit(Math.min(100, doc['grade'].value * params.correction))",
          params: {
            correction: 1.2
          }
        }
      }
    },
    aggregations: {
      grades_stats: {
        extended_stats: {
          field: 'grade.corrected'
        }
      }
    }
  }
)
puts response
GET /exams/_search
{
  "size": 0,
  "runtime_mappings": {
    "grade.corrected": {
      "type": "double",
      "script": {
        "source": "emit(Math.min(100, doc['grade'].value * params.correction))",
        "params": {
          "correction": 1.2
        }
      }
    }
  },
  "aggs": {
    "grades_stats": {
      "extended_stats": { "field": "grade.corrected" }
    }
  }
}

缺失值编辑

missing 参数定义了如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

response = client.search(
  index: 'exams',
  body: {
    size: 0,
    aggregations: {
      grades_stats: {
        extended_stats: {
          field: 'grade',
          missing: 0
        }
      }
    }
  }
)
puts response
GET /exams/_search
{
  "size": 0,
  "aggs": {
    "grades_stats": {
      "extended_stats": {
        "field": "grade",
        "missing": 0        
      }
    }
  }
}

grade 字段中没有值的文档将与值为 0 的文档归入同一个桶。