Hello,
I have a technical question about using nested data type, as expressed in the Query DSL.
Unfortunately, only today I discovered that i'm not building my nested queries as I should be.
I was generating the following wrong query:
GET my_index / blogpost / _search {
"query" : {
"bool" : {
"must" : [{
"query" : {
"nested" : {
"path" : "person",
"query" : {
"term" : {
"person.name" : "george"
}
}
}
}
}, {
"query" : {
"nested" : {
"path" : "person",
"query" : {
"term" : {
"person.itemsBought" : {
"gt" : 5
}
}
}
}
}
}
]
}
}
}
instead of producing the following correct query:
GET my_index / blogpost / _search {
"query" : {
"nested" : {
"path" : "person",
"query" : {
"bool" : {
"must" : [{
"term" : {
"person.name" : "george"
}
}, {
"range" : {
"person.itemsBought" : {
"gt" : 5
}
}
}
]
}
}
}
}
}
Obviously, the second option is suitable, right? Since it guarantees that the filters would be made on the SAME nested document rather than 2 different nested documents.
My real question is about building the correct equivalent nested aggregation query.
Is there a different between the following aggregations below?
Aggregation 1:
GET my_index / blogpost / _search {
"aggs" : {
"nested" : {
"path" : "person"
},
"aggs" : {
"filterByName" : {
"filter" : {
"term" : {
"person.name" : "george"
}
},
"aggs" : {
"filterByItemsCount" : {
"filter" : {
"range" : {
"person.itemsBought" : {
"gt" : 5
}
}
}
}
}
}
}
}
}
Aggregation 2:
GET my_index / blogpost / _search {
"aggs" : {
"nested" : {
"path" : "person"
},
"aggs" : {
"filterPerson" : {
"filter" : {
"bool" : {
"must" : [{
"term" : {
"person.name" : "george"
}
}, {
"range" : {
"person.itemsBought" : {
"gt" : 5
}
}
}
]
}
}
}
}
}
}
I believe aggregation 1 might be less optimized, but the results from both Aggregation 1 and Aggregation 2 should be same, right? After all, I believe there is an AND relationship between the 2 filter aggregations in Aggregation 1.
By the way, the full aggregation query involves reverse_nested aggregations and terms aggregation, but yet again - I don't believe it matters involving them into Aggregation 1 nor Aggregation 2 when they are all sub aggregations of each other (and therefore AND related).