То, чего вы пытаетесь достичь, может быть достигнуто путем субагрегации, другими словами агрегации внутри агрегации.
Для вашего случая сначала вы хотите сгруппировать по parternId
, поэтому вам потребуется условияагрегация на parternId
поле.Назовем это объединение partners
.Это даст вам два значения ожидаемого результата: parternId
и count
.
Теперь для каждой из групп (сегментов) partnerId
требуется totalValue
, т. Е. Сумма value
для каждого партнераЭто можно сделать, добавив сумма агрегации внутри термина агрегации partners
.Таким образом, окончательный запрос вместе с фильтром для даты (месяца) будет:
{
"query": {
"bool": {
"filter": {
"range": {
"date": {
"gte": "2019-01-01",
"lte": "2019-01-31"
}
}
}
}
},
"aggs": {
"partner": {
"terms": {
"field": "partnerId"
},
"aggs": {
"totalValue": {
"sum": {
"field": "value"
}
}
}
}
}
}
Пример результата (только для agg):
"aggregations": {
"partner": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 9876,
"doc_count": 3,
"totalValue": {
"value": 3704.68017578125
}
},
{
"key": 9878,
"doc_count": 2,
"totalValue": {
"value": 2454.1201171875
}
}
]
}
В результате выше key
равно partnerId
, doc_count
- это count
, а totalValue.value
- totalValue
вашего ожидаемого результата.