У меня есть индекс ElasticSearch с заказами.Заказ может иметь состояние (например, Создан, Обрабатывается, Подтверждено).Я хочу создать отчет, который показывает количество заказов на штат в месяц.Поэтому я хочу увидеть отчет вроде:
| x | Created | Processing | Confirmed |
|-------|---------|------------|-----------|
| March | 10 | 15 | 5 |
| April | 8 | 9 | 33 |
Я подумал, что мне нужно сохранить что-то вроде «Исторического заказа», потому что тот же заказ будет создан в марте, но подтвержден в апреле.Поэтому я сохраняю Орден вместе с его состоянием, а также с датой, когда он перешел в это состояние.
Я нашел этот вопрос SO , который показывает, как получить максимальное состояние.Но теперь я не знаю, как агрегировать по этой агрегации и получать количество состояний за период времени.
У меня пока такой запрос выглядит примерно так:
{
"query": {
"range": {
"stateDate": {
"lte": "2019-05-30"
}
}
},
"aggs": {
"by_order_id": {
"terms": {
"field": "orderId"
},
"aggs": {
"latest_state": {
"top_hits": {
"size": 1,
"sort": {
"stateDate": "desc"
},
"_source": [
"orderState",
"stateDate"
]
}
}
}
}
}
}
Обновление: некоторый пример объекта Order:
{
"orderId": "1234-5678-abcd", // some guid
"orderState": "Created|Processing|Confirmed", // enum
"stateDate": "2019-05-31 10:33" // the date-time when the order transitioned in that state
}
И представьте себе эти записи:
| orderId | orderState | stateDate |
|------------|------------|------------|
| 123 | Created | 2019-05-30 |
| 123 | Processing | 2019-05-31 |
| 123 | Confirmed | 2019-06-01 |
| 456 | Created | 2019-06-01 |
| 456 | Processing | 2019-06-01 |
Мне нужен отчет, в котором говорится, что у меня был 1 заказ в обработке в мае (заказ 123,это его окончательный статус в течение мая).В июне следует сказать, что у меня было 1 подтвержденный заказ (123) и 1 в обработке (456).
Надеюсь, теперь все стало понятнее.