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