Сначала вам нужно отобразить ваш массив как вложенное поле (скрипт будет сложным и бесполезным). Вложенные поля проиндексированы, агрегация будет довольно быстрой.
удалите ваш индекс / или создайте новый. Обратите внимание, что я использую тест как тип.
{
"mappings": {
"test": {
"properties": {
"city": {
"type": "keyword"
},
"cars": {
"type": "nested",
"properties": {
"name": {
"type": "keyword"
},
"purchase": {
"type": "integer"
},
"sold": {
"type": "integer"
}
}
}
}
}
}
}
Индексируйте ваш документ (так же, как вы сделали)
Для агрегации:
{
"size": 0,
"aggs": {
"avg_grade": {
"terms": {
"field": "city"
},
"aggs": {
"resellers": {
"nested": {
"path": "cars"
},
"aggs": {
"agg_name": {
"terms": {
"field": "cars.name"
},
"aggs": {
"avg_pur": {
"sum": {
"field": "cars.purchase"
}
},
"avg_sold": {
"sum": {
"field": "cars.sold"
}
}
}
}
}
}
}
}
}
}
результат:
buckets": [
{
"key": "Honda",
"doc_count": 2,
"avg_pur": {
"value": 350
},
"avg_sold": {
"value": 270
}
}
,
{
"key": "Toyota",
"doc_count": 2,
"avg_pur": {
"value": 150
},
"avg_sold": {
"value": 120
}
}
]
если у вас есть индекс поля имени / города в виде текста (сначала нужно спросить, если это необходимо), используйте .keyword в термине агрегации ("cars.name.keyword").