I have two scenarios that produce identical aggregation results in the final GET order/_search
query. The only difference between the two scenarios is where I choose to declare the type: nested
in the mapping and what I specify in the nested.path:
in the query.
SCENARIO 1 - Declare nested for order_items
PUT order
POST order/_mapping
{
"properties": {
"order_items": {
"type": "nested",
"properties": {
"product_id": {
"type": "long"
},
"product": {
"properties": {
"name": {
"type": "keyword"
},
"product_id": {
"type": "long"
},
"price": {
"type": "long"
}
}
}
}
}
}
}
POST order/_bulk
{"index":{}}
{"order_items":[{"product":{"name":"book","price":10}},{"product":{"name":"pencil","price":1}}]}
{"index":{}}
{"order_items":[{"product":{"name":"pen","price":5}},{"product":{"name":"eraser","price":1}}]}
GET order/_search
{
"size": 0,
"aggs": {
"order": {
"nested": {
"path": "order_items"
},
"aggs": {
"product_name" : {
"terms": {
"field": "order_items.product.name"
},
"aggs": {
"avg_price": {
"avg": {
"field": "order_items.product.price"
}
}
}
}
}
}
}
}
SCENARIO 2 - Declare nested for product
PUT order
POST order/_mapping
{
"properties": {
"order_items": {
"properties": {
"product_id": {
"type": "long"
},
"product": {
"type": "nested",
"properties": {
"name": {
"type": "keyword"
},
"product_id": {
"type": "long"
},
"price": {
"type": "long"
}
}
}
}
}
}
}
POST order/_bulk
{"index":{}}
{"order_items":[{"product":{"name":"book","price":10}},{"product":{"name":"pencil","price":1}}]}
{"index":{}}
{"order_items":[{"product":{"name":"pen","price":5}},{"product":{"name":"eraser","price":1}}]}
GET order/_search
{
"size": 0,
"aggs": {
"order": {
"nested": {
"path": "order_items.product"
},
"aggs": {
"product_name" : {
"terms": {
"field": "order_items.product.name"
},
"aggs": {
"avg_price": {
"avg": {
"field": "order_items.product.price"
}
}
}
}
}
}
}
}
My question is whether one approach is better than the other? Does this have anything to do with field map explosions or other performance concerns? Are there other things I need to be aware of between these two scenarios?