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"
}
}
}
}
}
}
}}
извините, его замок немного грязный, я не так хорош с этим редактором ответов