Нужна агрегация для объекта внутреннего массива документа - ElasticSearch - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь выполнить агрегацию по следующему документу

{
  "pid": 900000,
  "mid": 9000,
  "cid": 90,
  "bid": 1000,
  "gmv": 1000000,
  "vol": 200,
  "data": [
    {
      "date": "25-11-2018",
      "gmv": 100000,
      "vol": 20
    },
    {
      "date": "24-11-2018",
      "gmv": 100000,
      "vol": 20
    },
    {
      "date": "23-11-2018",
      "gmv": 100000,
      "vol": 20
    }
  ]
}

Анализ, который необходимо выполнить здесь:

  1. Фильтр по середине или / и cid по всемDocuments
  2. Фильтровать диапазон по data.date за последние 7 дней и суммировать data.vol за этот диапазон для каждого pid
  3. сортировать документы по сумме, полученной на предыдущем шаге, в порядке убывания
  4. Сгруппируйте эти результаты по pid.

Это означает, что мы пытаемся получить лучшие продукты по сумме объема (проданного количества) в пределах диапазона дат для конкретного cid / mid.

PID здесь обозначает идентификатор продукта, MID обозначает здесь идентификатор продавца, CID обозначает здесь идентификатор категории

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Пожалуйста, найдите вложенный запрос агрегации, который сортирует по "vol" для каждого сегмента "pid".В часть запроса можно добавить любое количество фильтров.

{ "size": 0, "query": { "bool": { "must": [ { "term": { "mid": "2" } } ] } }, "aggs": { "top_products_sorted_by_order_volume": { "terms": { "field": "pid", "order": { "nested_data_object>order_volume_by_range>order_volume_sum": "desc" } }, "aggs": { "nested_data_object": { "nested": { "path": "data" }, "aggs": { "order_volume_by_range": { "filter": { "range": { "data.date": { "gte": "2018-11-26", "lte": "2018-11-27" } } }, "aggs": { "order_volume_sum": { "sum": { "field": "data.ord_vol" } } } } } } } } } }

0 голосов
/ 28 ноября 2018

Во-первых, вам нужно изменить отображение, чтобы выполнить запрос для вложенных полей.измените тип поля 'data' на «вложенный».

Затем вы можете использовать запрос диапазона в фильтре вместе с фильтром условий в mid/cid для фильтрации данных.Как только вы получите правильный набор данных, вы можете агрегировать на pid после субагрегации на сумму vol.

. Вот нижеприведенный запрос.

{
    "query": {
        "bool": {
            "filter": [
                {
                    "bool": {
                        "must": [
                            {
                                "range": {
                                    "data.date": {
                                        "gte": "28-11-2018",
                                        "lte": "25-11-2018"
                                    }
                                }
                            },
                            {
                                "must": [
                                    {
                                        "terms": {
                                            "mid": [
                                                "9000"
                                            ]
                                        }
                                    }
                                ]
                            }
                        ]
                    }
                }
            ]
        }
    },
    "aggs": {
        "AGG_PID": {
            "terms": {
                "field": "pid",
                "size": 0,
                "order": {
                    "TOTAL_SUM": "desc"
                },
                "min_doc_count": 1
            },
            "aggs": {
                "TOTAL_SUM": {
                    "sum": {
                        "field": "data.vol"
                    }
                }
            }
        }
    }
}

Youможет изменить запрос соответственно.Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...