Композитный агрегат против субагрегата - PullRequest
0 голосов
/ 05 октября 2018

Краткий вопрос

Как суммировать данные по сегментам, основанным на части составного ключа?

Подробный вопрос

В течение нескольких дней у меня есть запасы определенных товаров определенных магазинов, принадлежащих определенным розничным магазинам.Теперь я хочу, чтобы средний запас по продукту на каждого розничного продавца суммировался по магазинам.

Следующий запрос выполняет то, что я хочу:

{
    "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

...