We are working on updating this book for the latest version. Some content might be out of date.
Because nested objects
are indexed as separate hidden documents, we can’t
query them directly.
Instead, we have to use the
nested query to access them:
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "eggs" }},
{
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{ "match": { "comments.name": "john" }},
{ "match": { "comments.age": 28 }}
]
}}}}
]
}}}
The | |
The | |
The |
A nested field can contain other nested fields. Similarly, a nested
query can contain other nested queries. The nesting hierarchy is applied
as you would expect.
Of course, a nested query could match several nested documents.
Each matching nested document would have its own relevance score, but these
multiple scores need to be reduced to a single score that can be applied to
the root document.
By default, it averages the scores of the matching nested documents. This can
be controlled by setting the score_mode parameter to avg, max, sum, or
even none (in which case the root document gets a constant score of 1.0).
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "eggs" }},
{
"nested": {
"path": "comments",
"score_mode": "max",
"query": {
"bool": {
"must": [
{ "match": { "comments.name": "john" }},
{ "match": { "comments.age": 28 }}
]
}}}}
]
}}}A nested filter behaves much like a nested query, except that it doesn’t
accept the score_mode parameter. It can be used only in filter context—such as inside a filtered query—and it behaves like any other filter:
it includes or excludes, but it doesn’t score.
While the results of the nested filter itself are not cached, the usual
caching rules apply to the filter inside the nested filter.