У меня есть около 5 пар ключ-значение в данных эластичного поиска на объект, я хочу добавить значения определенных ключей (audio_calls) тех объектов, где некоторые другие ключи имеют нужные мне значения (network_type, weather). Я хочу, чтобы результат был сгруппирован по area_num
.
Например
{
.
.
"audio_calls":2000,
"area": "a",
"area_num": 1,
"network_type":"3g",
"weather":"sunny"
.
.
}
{
.
.
"audio_calls":1420,
"area": "a",
"area_num": 1,
"network_type":"4g",
"weather":"stormy"
.
.
}
{
.
.
"audio_calls": 1503,
"area": "c",
"area_num": 2,
"network_type":"4g"
"weather":"cold"
}
{
.
.
"audio_calls": 4051,
"area": "c",
"area_num": 2,
"network_type":"4g"
"weather":"sunny"
}
{
.
.
"audio_calls": 240,
"area": "e",
"area_num": 3,
"network_type":"2g",
"weather":"cloudy"
.
.
.
}
.
.
.
Я предполагаю, что мне нужно сделать это с помощью агрегации, но я не знаю, как условно добавить значения audio_calls
, скажем, добавить только те audio_calls
, где network_type
равно 3g
и weather
sunny
.
С помощью (PHP) кода, который я попробовал (Filtered Aggregation), агрегация просто добавила все вызовы во всех объектах без группировки по area_num.
'aggs' => [
'filter_by_conditions' => [
'filter' => [
'terms' => ['network_type' => $network_type],
'terms' => ['weather' => $weather],
],
'aggs' => [
'sum_of_calls' => [
'sum' => ['field' => $call_type]
],
'aggs' => [
'terms' => ['field' => $area_num, 'size' => 1000]
]
]
]
(где $ call_type = "audio_calls";)
"aggregations":{"filter_by_conditions":
{"doc_count":1665,"sum_of_calls":{"value":31464}}}}
Я хочу вывод, который был агрегирован на основе area_num
и добавлены только audio_calls, которые удовлетворяют выбранным network_type
и weather
, для каждого area_num
.