弹性搜索如何获取日期直方图Agg桶中所有百分位值的总平均值

时间:2019-05-01 14:12:59

标签: elasticsearch

我有一个查询日期直方图agg,其中包含间隔(例如1个月)的延迟值的95%aggs。

通过查询,我可以获得百分位的星期值。我想在存储桶中平均获取所有百分比。

查询:

th

我得到的当前答复:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "range": {
          "timestamp": {
            "gte": "2019-04-03 10:35:04 UTC",
            "lte": "2019-05-01 10:35:04 UTC"
          }
        }
      }
    }
  },
  "aggs": {
    "weeks_avg": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "7d",
        "min_doc_count": 1
      },
      "aggs": {
        "week": {
          "percentiles": {
            "field": "value",
            "percents": [
              95
            ],
            "hdr": {
              "number_of_significant_value_digits": 3
            }
          }
        }
      }
    }
  }
}

我是否需要创建另一个Agg来计算这5个存储桶的AVG值?换句话说,执行以下操作:

totalPercentileAvg =(week1.percentileValue + week2.percentileValue + week3.percentileValue + week4.percentileValue)/ 4;

我有点困惑,因为已经尝试了许多语法错误。

谢谢。

2 个答案:

答案 0 :(得分:1)

如果要同时使用95和avg,则可以分别指定它们:

 ...
 "aggs": {
    "weeks_avg": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "7d",
        "min_doc_count": 1
      },
      "aggs": {
        "week": {
          "percentiles": {
            "field": "value",
            "percents": [
              95
            ],
            "hdr": {
              "number_of_significant_value_digits": 3
            }
          }
        },
        "week_avg" : {
          "avg": {
            "field": "value"
          }
        }
      }
    }
  }

编辑: 要获得95%的平均值:

 ...
 "aggs": {
    "weeks_avg": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "7d",
        "min_doc_count": 1
      },
      "aggs": {
        "week": {
          "percentiles": {
            "field": "value",
            "percents": [
              95
            ],
            "hdr": {
              "number_of_significant_value_digits": 3
            }
          }
        }
      }
    },
    "avg_weekly_value": {
      "avg_bucket": {
        "buckets_path": "weeks_avg>week.95" 
    }
  }

答案 1 :(得分:0)

在这里要小心-确保您了解要获取的统计信息。躲起来假设您正在以某种方式查看性能,例如数据库响应时间(以毫秒为单位)。越低越好。

您将这个问题描述为

totalPercentileAvg =(week1.percentileValue + week2.percentileValue + week3.percentileValue + week4.percentileValue)/ 4;

首先,如果您想将整个4个期间汇总为一个数字,为​​什么只取整个4周内计算出的percentileValue,这有什么问题呢?

我不敢将这个数字任意分成4个,然后取这4个的平均值作为值?想象一下,您有3个好礼拜,而交易量少,而一个坏礼拜却有,交易量大。在好的星期,您的percentileValue是400。在糟糕的星期,它是800。这里的平均值是500ms,这似乎还可以。但是,也许在糟糕的一周里的交易量是在三个好的星期里的10倍,并且您的客户体验缓慢,但是您的统计数据几乎完全忽略了这一点。

(您引用的数据在一周和另一周之间的命中率几乎完全是10:1)