У меня очень большой объем документов в ElasticSearch (5.5), в которых записанные данные хранятся через регулярные промежутки времени, скажем, каждые 3 секунды.
{
"@timestamp": "2015-10-14T12:45:00Z",
"channel1": 24.4
},
{
"@timestamp": "2015-10-14T12:48:00Z",
"channel1": 25.5
},
{
"@timestamp": "2015-10-14T12:51:00Z",
"channel1": 26.6
}
Допустим, мне нужно вернуть результаты длязапрос, который запрашивает значение точки каждые 5 секунд.Интерференционная картина возникает там, где иногда будет точное совпадение (для простоты, скажем, в вышеприведенном примере, что 12:45 - единственная выборка, полученная кратно пяти).
В эти времена,Я хочу, чтобы эластичность предоставила мне точное значение, записанное в то время, если оно есть.Таким образом, в 12:45 есть совпадение, поэтому оно возвращает значение 24,4
В остальных случаях мне требуется последнее (ранее записанное) значение.Таким образом, в 12:50, не имея данных в это точное время, он вернул бы значение в 12:48 (25,5), являющееся последним известным значением.
Ранее я использовал агрегации, но в этом случае это непомощь, потому что я не хочу, чтобы какое-то среднее значение получалось из набора данных, мне нужно либо точное значение для точного совпадения времени, либо предыдущее значение, если нет совпадения.
Я мог бы сделать это программно, но производительностьреальная проблема здесь, поэтому мне нужно придумать наиболее эффективный метод, который можно получить для данных в указанном порядке.Возвращение ВСЕХ эластичных данных и итерация результатов и проверка соответствия в каждом временном интервале, в противном случае сохранение элемента с индексом i-1 звучит медленно, и мне интересно, не так ли это лучше.
Возможно, яЯ упускаю трюк с Elastic.Возможно, кто-то знает способ сделать именно то, что я после ?!Было бы очень полезно ...
Отображение выглядит так:
"mappings": {
"sampleData": {
"dynamic": "true",
"dynamic_templates": [{
"pv_values_template": {
"match": "GroupId", "mapping": { "doc_values": true, "store": false, "type": "keyword" }
}
}],
"properties": {
"@timestamp": { "type": "date" },
"channel1": { "type": "float" },
"channel2": { "type": "float" },
"item": { "type": "object" },
"keys": { "properties": { "count": { "type": "integer" }}},
"values": { "properties": { "count": { "type": "integer" }}}
}
}
}
и вызываемый метод (NEST) выглядит так:
channelAggregation => channelAggregation.DateHistogram("HistogramFilter", histogram => histogram
.Field(dataRecord => dataRecord["@timestamp"])
.Interval(interval)
.MinimumDocumentCount(0)
.ExtendedBounds(start, end)
.Aggregations(aggregation => DataFieldAggregation(channelNames, aggregation)));
@Nikolay, может быть до 1400 блоков (максимум один velue, который будет возвращен на пиксель, доступный на графике)