Запрос или алгоритм ElasticSearch (5.5), необходимые для извлечения значений по временной метке с интерференционной картиной - PullRequest
0 голосов
/ 26 ноября 2018

У меня очень большой объем документов в 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, который будет возвращен на пиксель, доступный на графике)

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