首页 > 解决方案 > 有什么方法可以汇总没有异常值的弹性平均值?

问题描述

我需要一种方法来创建一个转换,该转换将聚合一个字段的平均值但没有异常值(假设只有介于 10%-90% 百分位数之间的值)。例如,如果我有以下文件:

[
{someField:1},
{someField:2},
{someField:3},
{someField:4},
{someField:5},
{someField:6},
{someField:7},
{someField:8},
{someField:9},
{someField:10}
]

它将计算 2-9 的平均值

编辑:将“value”重命名为“someField”

标签: elasticsearchtransform

解决方案


您可以通过聚合一次性完成此操作,但您必须编写 percentiles 函数,然后编写 avg 函数——我在这里编写了一个。但是脚本不会高效,所以我认为不值得付出努力……</p> scripted_metric

相反,我建议先检索百分位界限

POST myindex/_search
{
  "size": 0,
  "aggs": {
    "boundaries": {
      "percentiles": {
        "field": "value",
        "percents": [
          10,
          90
        ]
      }
    }
  }
}

产生[1.5, 9.5]然后将这些数字插入加权平均聚合中:

POST myindex/_search
{
  "size": 0,
  "aggs": {
    "avg_without_outliers": {
      "weighted_avg": {
        "value": {
          "field": "value"
        },
        "weight": {
          "script": {
            "source": "def v = doc.value.value; return v <= params.min || v >= params.max ? 0 : 1",
            "params": {
              "min": 1.5,
              "max": 9.5
            }
          }
        }
      }
    }
  }
}

weight0 或 1,取决于被遍历的特定文档是否是异常值。


推荐阅读