Краткий вопрос
Как суммировать данные по сегментам, основанным на части составного ключа?
Подробный вопрос
В течение нескольких дней у меня есть запасы определенных товаров определенных магазинов, принадлежащих определенным розничным магазинам.Теперь я хочу, чтобы средний запас по продукту на каждого розничного продавца суммировался по магазинам.
Следующий запрос выполняет то, что я хочу:
{
"size": 0,
"aggs": {
"docs": {
"composite": {
"sources": [
{"retailer": {"terms": {"field": "retailer"}}},
{"ean": {"terms": {"field": "ean"}}},
],
"size": 10000,
},
"aggs": {
"average_quantity_per_store": {
"terms": {"field": "store", "size": 1000.0},
"aggs": {
"average_quantity": {
"avg": {"field": "quantity"}
}
}
},
"average_quantity": {
"sum_bucket": {"buckets_path": "average_quantity_per_store>average_quantity"}
}
}
},
},
"query": filter_query
}
Результат выглядит так:
{
"took": 3885,
"timed_out": false,
"hits": {
"total": 137960,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"docs": {
"after_key": {
"retailer": "some_retailer",
"ean": "some_ean"
},
"buckets": [
{
"key": {
"retailer": "a_retailer",
"ean": "an_ean"
},
"doc_count": 29,
"average_quantity_per_store": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Store 1",
"doc_count": 5,
"average_quantity": {
"value": 2.0
}
},
{
"key": "Store 2",
"doc_count": 4,
"average_quantity": {
"value": 1.0
}
}
]
},
"average_quantity": {
"value": 3.0
}
}
]
}
}
}
Меня здесь интересует только значение 3.0.Время, затрачиваемое на это, довольно большое (почти 4 секунды).Я надеялся оптимизировать это, используя следующий запрос:
{
"size": 0,
"aggs": {
"docs": {
"composite": {
"sources": [
{"retailer": {"terms": {"field": "retailer"}}},
{"ean": {"terms": {"field": "ean"}}},
{"store": {"terms": {"field": "store"}}},
],
"size": 10000,
},
"aggs": {
"average_quantity": {
"avg": {"field": "quantity"}
}
}
},
},
"query": filter_query
}
Если я выполню это, результат будет:
{
"took": 577,
"timed_out": false,
"hits": {
"total": 137960,
"max_score": 0.0,
"hits": []
},
"aggregations": {
"docs": {
"after_key": {
"retailer": "some_retailer",
"ean": "some_ean",
"store": "some_store"
},
"buckets": [
{
"key": {
"retailer": "a_retailer",
"ean": "an_ean",
"store": "Store 1"
},
"doc_count": 5,
"average_quantity": {
"value": 2.0
}
},
{
"key": {
"retailer": "a_retailer",
"ean": "an_ean",
"store": "Store 2"
},
"doc_count": 4,
"average_quantity": {
"value": 1.0
}
}
]
}
}
}
Мне кажется, что основная часть работыэто сделано этим.Так намного быстрее.Однако теперь мне нужно суммировать сегменты с одной и той же комбинацией розничной торговли и ean по различным магазинам.
1) Есть ли способ в ElasticSearch для суммирования определенных сегментов на основе частей составного ключа?
Другим способом было бы выполнить постобработку в приложении Python, которое в первую очередь вызывает ElasticSearch.
2) Будет ли это рекомендовано?Сколько штрафа я получу за передачу большого объема данных?
Примечание. Я использую ElasticSearch 6.4