Wraps another query to search nested fields.
The nested
query searches nested field objects as if they were indexed as separate documents. If an object matches the search, the nested
query returns the root parent document.
To use the nested
query, your index must include a nested field mapping. For example:
PUT /my-index-000001
{ "mappings": { "properties": { "obj1": { "type": "nested" } } } }
GET /my-index-000001/_search
{ "query": { "nested": { "path": "obj1", "query": { "bool": { "must": [ { "match": { "obj1.name": "blue" } }, { "range": { "obj1.count": { "gt": 5 } } } ] } }, "score_mode": "avg" } } }
path
query
path
. If an object matches the search, the nested
query returns the root parent document.
You can search nested fields using dot notation that includes the complete path, such as obj1.name
.
Multi-level nesting is automatically supported, and detected, resulting in an inner nested query to automatically match the relevant nesting level, rather than root, if it exists within another nested query.
See Multi-level nested queries for an example.
score_mode
avg
, but nested knn
queries only support score_mode=max
. Valid values are:
avg
(Default)
max
min
none
0
.
sum
ignore_unmapped
path
and not return any documents instead of an error. Defaults to false
.
If false
, Elasticsearch returns an error if the path
is an unmapped field.
You can use this parameter to query multiple indices that may not contain the field path
.
If you run a script
query within a nested query, you can only access doc values from the nested document, not the parent or root document.
To see how multi-level nested queries work, first you need an index that has nested fields. The following request defines mappings for the drivers
index with nested make
and model
fields.
PUT /drivers
{ "mappings": { "properties": { "driver": { "type": "nested", "properties": { "last_name": { "type": "text" }, "vehicle": { "type": "nested", "properties": { "make": { "type": "text" }, "model": { "type": "text" } } } } } } } }
Next, index some documents to the drivers
index.
PUT /drivers/_doc/1
{ "driver" : { "last_name" : "McQueen", "vehicle" : [ { "make" : "Powell Motors", "model" : "Canyonero" }, { "make" : "Miller-Meteor", "model" : "Ecto-1" } ] } } PUT /drivers/_doc/2?refresh { "driver" : { "last_name" : "Hudson", "vehicle" : [ { "make" : "Mifune", "model" : "Mach Five" }, { "make" : "Miller-Meteor", "model" : "Ecto-1" } ] } }
You can now use a multi-level nested query to match documents based on the make
and model
fields.
GET /drivers/_search
{ "query": { "nested": { "path": "driver", "query": { "nested": { "path": "driver.vehicle", "query": { "bool": { "must": [ { "match": { "driver.vehicle.make": "Powell Motors" } }, { "match": { "driver.vehicle.model": "Canyonero" } } ] } } } } } } }
The search request returns the following response:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 3.7349272,
"hits" : [
{
"_index" : "drivers",
"_id" : "1",
"_score" : 3.7349272,
"_source" : {
"driver" : {
"last_name" : "McQueen",
"vehicle" : [
{
"make" : "Powell Motors",
"model" : "Canyonero"
},
{
"make" : "Miller-Meteor",
"model" : "Ecto-1"
}
]
}
}
}
]
}
}
If a nested
query matches one or more nested objects in a document, it returns the document as a hit. This applies even if other nested objects in the document donât match the query. Keep this in mind when using a nested
query that contains an inner must_not
clause.
Tip
Use the inner_hits
parameter to see which nested objects matched a nested
query.
For example, the following search uses an outer nested
query with an inner must_not
clause.
PUT my-index
{ "mappings": { "properties": { "comments": { "type": "nested" } } } } PUT my-index/_doc/1?refresh { "comments": [ { "author": "kimchy" } ] } PUT my-index/_doc/2?refresh { "comments": [ { "author": "kimchy" }, { "author": "nik9000" } ] } PUT my-index/_doc/3?refresh { "comments": [ { "author": "nik9000" } ] } POST my-index/_search { "query": { "nested": { "path": "comments", "query": { "bool": { "must_not": [ { "term": { "comments.author": "nik9000" } } ] } } } } }
The search returns:
{
... "hits" : { ... "hits" : [ { "_index" : "my-index", "_id" : "1", "_score" : 0.0, "_source" : { "comments" : [ { "author" : "kimchy" } ] } }, { "_index" : "my-index", "_id" : "2", "_score" : 0.0, "_source" : { "comments" : [ { "author" : "kimchy" }, { "author" : "nik9000" } ] } } ] } }
To exclude documents with any nested objects that match the nested
query, use an outer must_not
clause.
POST my-index/_search
{ "query": { "bool": { "must_not": [ { "nested": { "path": "comments", "query": { "term": { "comments.author": "nik9000" } } } } ] } } }
The search returns:
{
... "hits" : { ... "hits" : [ { "_index" : "my-index", "_id" : "1", "_score" : 0.0, "_source" : { "comments" : [ { "author" : "kimchy" } ] } } ] } }
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4