Elasticsearch — предотвращает отображение гистограммы даты

#elasticsearch

Вопрос:

Я хочу сделать сводку на основе метки времени, используя date_histogram, и получить среднее значение значений в каждом временном диапазоне.

 {
    "aggregations": {
        "timestamp": {
            "date_histogram": {
                "field": "timestamp",
                "interval": "300s",
                "offset": 0,
                "order": {
                    "_key": "asc"
                },
                "keyed": false,
                "min_doc_count": 0
            },
            "aggregations": {
                "myAgg": {
                    "avg": {
                        "field": "value"
                    }
                }
            }
        }
    }
}
 

Однако проблема заключается в том, что, несмотря на то, что значения(0,0 ~ 3,9) являются плавающими, результат агрегирования дает среднее значение по значениям.
(Например 1.1 -> 1, 2.2 ->> 2).

Вот примерный результат.

 
    "hits" : [
      {
        "_index" : "originals-20210915",
        "_type" : "_doc",
        "_score" : 5.6003222,
        "_source" : {
          "instanceName" : "LI9",
          "metric" : "tps",
          "value" : 0.36666667,
          "timestamp" : "1631717705000"
        }
      },
      {
        "_index" : "originals-20210915",
        "_type" : "_doc",
        "_score" : 5.5940228,
        "_source" : {
          "instanceName" : "DN3",
          "metric" : "tps",
          "value" : 2.8333333,
          "timestamp" : "1631717705000"
        }
      },
      {
        "_index" : "originals-20210915",
        "_type" : "_doc",
        "_score" : 5.5914664,
        "_source" : {
          "instanceName" : "LI9",
          "metric" : "tps",
          "value" : 0.13333334,
          "timestamp" : "1631717700000"
        }
      },
      {
        "_index" : "originals-20210915",
        "_type" : "_doc",
        "_score" : 5.5914664,
        "_source" : {
          "instanceName" : "DN3",
          "metric" : "tps",
          "value" : 3.3,
          "timestamp" : "1631717700000"
        }
      }
    ]
  },
  "aggregations" : {
    "instanceName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "LI9",
          "doc_count" : 2,
          "timestamp" : {
            "buckets" : [
              {
                "key_as_string" : "2021-09-15T14:55:00.000Z",
                "key" : 1631717700000,
                "doc_count" : 2,
                "myAgg" : {
                  "value" : 0.0
                }
              }
            ]
          }
        },
        {
          "key" : "DN3",
          "doc_count" : 2,
          "timestamp" : {
            "buckets" : [
              {
                "key_as_string" : "2021-09-15T14:55:00.000Z",
                "key" : 1631717700000,
                "doc_count" : 2,
                "myAgg" : {
                  "value" : 2.5
                }
              }
            ]
          }
        }
      ]
 

Я хочу знать, можно ли получить точное среднее значение.

Комментарии:

1. Пожалуйста, поделитесь кучей вашего набора данных, вы также можете использовать top_hits подагры timestamp , чтобы отобразить, какие документы основаны на avg значении, а затем самостоятельно рассчитать среднее значение, чтобы проверить, правильно ли оно

2. Документы имеют вид {значение: 0,14, метка времени: 1631717800000}, {значение: 2,2, метка времени: 1631717800000} …

3. Да, я понимаю, но чтобы проверить то, что вы сказали, мне нужно больше примеров или поделиться значением top_hits среднее значение, которое вы получаете за одно ведро

4. @ExploZe Спасибо за ваш комментарий, я добавил пример результата.

Ответ №1:

Основываясь на том, чем вы делитесь, это, вероятно, проблема с отображением, ваше поле value , integer я думаю, вместо long этого .

Таким образом, данные возвращаются с индексированным значением, но находятся в фоновом int режиме, после чего среднее значение вычисляется неправильно.

Вы не можете изменить сопоставление с integer на long после индексирования, поэтому вам необходимо использовать _reindex для правильной переиндексации ваших данных.

Вы оба кажетесь такими :

 GET originals-20210915/_mapping
{
  "originals-20210915" : {
    "mappings" : {
      "properties" : {
        "value" : {
          "type" : "integer"
        }
      }
    }
  }
}
 

Вместо

 {
  "originals-20210915" : {
    "mappings" : {
      "properties" : {
        "value" : {
          "type" : "float" // long
        }
      }
    }
  }
}