WARNING: The 2.x versions of Elasticsearch have passed their EOL dates. If you are running a 2.x version, we strongly advise you to upgrade.
This documentation is no longer maintained and may be removed. For the latest information, see the current Elasticsearch documentation.
Querying a Nested Object
editQuerying a Nested Object
editBecause 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
}
}
]
}
}
}
}
]
}
}
}
If placed inside the filter clause of a Boolean query, a nested query behaves
much like a nested query, except that it doesn’t accept the score_mode
parameter. Because it is being used as a non-scoring query — it includes or excludes,
but doesn’t score — a score_mode doesn’t make sense since there is nothing to score.