elasticsearch 有没有什么方法可以聚合一个平均值,而不包含弹性异常值?

i7uaboj4  于 2023-03-01  发布在  ElasticSearch
关注(0)|答案(1)|浏览(112)

我需要一种方法来创建一个转换,将聚合字段的平均值,但没有离群值(让我们说只有值福尔斯在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”

qvk1mo1f

qvk1mo1f1#

你可以用一个scripted_metric aggregation一次完成这个,但是你必须写百分位函数,然后写avg函数--我写了一个here,但是这个脚本不会有很好的性能,所以我认为不值得这么做...
我建议首先检索percentile bounds

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

生成[1.5, 9.5],然后将这些数字插入weighted average aggregation

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
            }
          }
        }
      }
    }
  }
}

weight为0或1,这取决于被遍历的特定文档是否是离群值。

相关问题