ElasticSearch Aggregation для вложенного поля с разбивкой по родительскому идентификатору

Ниже приведена структура моего документа

'Order': {
    u'properties': {
        u'order_id': {u'type': u'integer'},
        'Product': {
            u'properties': {
                u'product_id': {u'type': u'integer'},                
                u'product_category': {'type': 'text'},                
            },
            u'type': u'nested'
        }
    }
}

doc1

"Order": {
    "order_id": "1",
    "Product": [
        {
            "product_id": "1", 
            "product_category": "category_1"
        }, 
        {
            "product_id": "2", 
            "product_category": "category_2"
        },
        {
            "product_id": "3", 
            "product_category": "category_2"
        },
    ] 
}

doc2

"Order": {

    "order_id": "2",
    "Product": [
        {
            "product_id": "4", 
            "product_category": "category_1"
        }, 
        {
            "product_id": "1", 
            "product_category": "category_1"
        },
        {
            "product_id": "2", 
            "product_category": "category_2"
        },
    ] 
}

Я хочу получить следующий вывод

"aggregations": {
    "Order": [
        {
            "order_id": "1"                
            "category_counts": [
                {
                    "category_1": 1
                },
                {
                    "category_2": 2
                },
            ]
        }, 
        {
            "order_id": "1"                
            "category_counts": [
                {
                    "category_1": 2
                },
                {
                    "category_2": 1
                },
            ]
        }, 
    ]
}

Я пробовал использовать вложенную агрегацию

"aggs": {
    "Product-nested": {
        "nested": {
            "path": "Product"
        }
        "aggs": {
            "category_counts": {
                "terms": {
                    "field": "Product.product_category"
                }
            }
        }, 
    }
}

Он не дает вывод для каждого заказа, но дает объединенный вывод для всех заказов

{
    "Product-nested": {
        "category_counts": [
            "category_1": 3,
            "category_2": 3
        ]
    }
}

У меня есть два вопроса:

  • Как получить желаемый результат в приведенном выше сценарии?
  • Что если вместо единственной product_category у меня есть массив product_category, то как мы добьемся того же в этом сценарии?

Я использую эластичный поиск>= 5.0

1 ответ

У меня есть идея, но я не считаю ее лучшей..

Вы можете выполнить агрегирование терминов в поле "order_id", а затем агрегирование подузлов в "Product.product_category".

что-то вроде этого:

{

"aggs": {

"all-order-id": {
  "terms": {
    "field": "order_id",
    "size": 10
  },
  "aggs": {
    "Product-nested": {
      "nested": {
        "path": "Product"
      },
      "aggs": {
        "all-products-in-order-id": {
          "terms": {
            "field": "Product.product_category"
          }
        }
      }
    }
  }
}

}}

извините, его замок немного грязный, я не так хорош с этим редактором ответов

Другие вопросы по тегам