Эластичный поиск, как получить общее среднее значение всех процентилей в сегментах гистограммы даты - PullRequest
2 голосов
/ 01 мая 2019

У меня есть запрос на аггистограмму даты, содержащую 95 процентильных агг значений значений задержки для интервала (например, 1 месяц).

С помощью запроса я могу получить интервалы недели с процентилем. Я хотел бы получить среднее значение всех процентилей в ведрах.

Запрос:

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

Текущий ответ, который я получаю:

 "aggregations":{
      "weeks_avg":{
         "buckets":[
            {
               "key_as_string":"2019-03-28 00:00:00 UTC",
               "key":1553731200000,
               "doc_count":147,
               "week":{
                  "values":{
                     "95.0":24.0078125
                  }
               }
            },
            {
               "key_as_string":"2019-04-04 00:00:00 UTC",
               "key":1554336000000,
               "doc_count":1815,
               "week":{
                  "values":{
                     "95.0":23.0078125
                  }
               }
            },
            {
               "key_as_string":"2019-04-11 00:00:00 UTC",
               "key":1554940800000,
               "doc_count":1821,
               "week":{
                  "values":{
                     "95.0":22.0078125
                  }
               }
            },
            {
               "key_as_string":"2019-04-18 00:00:00 UTC",
               "key":1555545600000,
               "doc_count":1815,
               "week":{
                  "values":{
                     "95.0":22.0078125
                  }
               }
            },
            {
               "key_as_string":"2019-04-25 00:00:00 UTC",
               "key":1556150400000,
               "doc_count":1671,
               "week":{
                  "values":{
                     "95.0":24.0078125
                  }
               }
            }
         ]
      }
   }
}

Нужно ли создавать еще одно Agg для вычисления значения AVG этих 5 сегментов? Другими словами, сделайте что-то вроде этого:

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

Я немного сбит с толку, так как уже получаю много ошибок синтаксиса.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Если вы хотите 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"
          }
        }
      }
    }
  }

EDIT: Чтобы получить средние значения 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" 
    }
  }
0 голосов
/ 02 мая 2019

Будьте осторожны - убедитесь, что вы понимаете, о чем говорит статистика, которую вы получаете.И прячься от тебя.Представим, что вы каким-то образом смотрите на производительность, например, время отклика базы данных, измеренное в мс.Чем ниже, тем лучше.

Вы задали этот вопрос как

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

Во-первых, что не так, почему просто брать процентыValue, рассчитанные за 4 недели в целом, если вы пытаетесь суммировать весь 4 период в одно число?

Меня не убеждает ценность произвольного разбиения этого значения на4 числа, то принимая среднее из этих 4?Представим, что у вас было 3 хорошие недели с низким объемом и одна плохая с большим объемом.В хорошие недели у вас процентное значение было 400. В плохую неделю это было 800. Среднее здесь 500 мс, что, кажется, нормально.Но, возможно, объем плохой недели был в 10 раз больше, чем за 3 хороших недели, и у ваших клиентов был медленный опыт, но ваша статистика пропускает это почти полностью.

(Данные, которые вы цитировали, имели почти точно 10:1 соотношение в обращениях между неделями)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...