Вы можете сделать это, используя агрегаты , в частности Термины агрегирования .И это можно сделать всего за один запуск, включив их в свою структуру запроса;чтобы дать ES команду на создание аналитических данных, основанных на агрегациях, вам необходимо включить объект aggregations
(или aggs
) и указать в нем тип агрегации, который вы хотели бы, чтобы ES запускал для ваших данных.
{
"query": {
"match_all": {}
},
"aggs": {
"group_by_product": {
"terms": {
"field": "productCode"
},
"aggs": {
"units_sold": {
"sum": {
"field": "quantity"
}
}
}
}
}
}
Запустив этот запрос, помимо результатов поиска по вашему запросу (в данном случае мы выполняем сопоставление всех), в объект ответа будет включен дополнительный объект, содержащий соответствующие результирующие агрегаты.Например,
{
...
"hits": {
"total": 6,
"max_score": 1,
"hits": [ ... ]
},
"aggregations": {
"group_by_product": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "b",
"doc_count": 3,
"units_sold": {
"value": 60
}
},
{
"key": "a",
"doc_count": 2,
"units_sold": {
"value": 20
}
},
{
"key": "c",
"doc_count": 1,
"units_sold": {
"value": 5
}
}
]
}
}
}
Для краткости я опустил некоторые детали из объекта ответа и выделил важную часть, которая находится внутри объекта aggregations
.Вы можете видеть, как агрегированные данные состоят из разных сегментов, каждый из которых представляет отдельные типы продуктов (идентифицированные с помощью клавиши key
), которые были найдены в ваших документах, doc_count
содержит число вхождений на тип продукта и unit_sold
object содержит общую сумму сумму единиц, проданных по каждому из типов продуктов.
Важно помнить, что для выполнения агрегации по string или текстовые поля, вам необходимо включить параметр fielddata в вашем отображении полей, так как этот параметр по умолчанию отключен во всех текстовых полях.Для того, чтобы обновить отображение, например.поля кода продукта, вам просто нужно отправить запрос PUT на соответствующий тип отображения в индексе, например,
PUT http://localhost:9200/sales/sale/_mapping
{
"properties": {
"productCode": {
"type": "string",
"fielddata": true
}
}
}
(больше info о настройке fielddata)