Агрегированный вывод из ElasticSearch - PullRequest
0 голосов
/ 30 марта 2020

Я использую ElasticSearch для хранения около 50 миллионов данных. Формат данных приведен ниже.

_id:5e444fc1c5e86c84d1044aeb
meter_id:"jhk"
date:2017-06-17T18:39:28.795+00:00
activePower:Object
unit:"kwh"
Active Power L1:"0"
Active Power L2:"0"
Active Power L3:"0"
Total Active Power:"5"
reactivePower:Object
apparentPower:Object
frequency:Object
thd:Object

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

ожидаемый результат

[
{ date: '04-19', totalActivePower: 5000},
{ date: '05-19', totalActivePower: 6000}
]

1 Ответ

0 голосов
/ 30 марта 2020

Вы можете использовать дата_гистограмма агрегация

Запрос

{
  "size": 0, 
  "query": {
    "range": {    --> to filter between dates, you can also use filter aggregation
      "date": {
        "gte": "2017-06-16",
        "lte": "2017-06-17"
      }
    }
  },
  "aggs": {
    "perday": {  
      "date_histogram": {   ---> will split documents on per day basis
        "field": "date",
        "interval": "day"
      },
      "aggs": {
        "totalacticepower": { -- sum of field Total Active Power on that day
          "sum": {
            "field": "Total Active Power"
          }
        }
      }
    }
  }
}

Результат:

"aggregations" : {
    "perday" : {
      "buckets" : [
        {
          "key_as_string" : "2017-06-17T00:00:00.000Z",
          "key" : 1497657600000,
          "doc_count" : 1,
          "totalacticepower" : {
            "value" : 5.0
          }
        }
      ]
    }
  }
...