Movatterモバイル変換


[0]ホーム

URL:


Loading

Nested query

Wraps another query to searchnested fields.

Thenested query searches nested field objects as if they were indexed as separate documents. If an object matches the search, thenested query returns the root parent document.

To use thenested query, your index must include anested 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
(Required, string) Path to the nested object you wish to search.
query
(Required, query object) Query you wish to run on nested objects in thepath. If an object matches the search, thenested query returns the root parent document.

You can search nested fields using dot notation that includes the complete path, such asobj1.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.

SeeMulti-level nested queries for an example.

score_mode
(Optional, string) Indicates how scores for matching child objects affect the root parent document’srelevance score. Default isavg, but nestedknn queries only supportscore_mode=max. Valid values are:
avg (Default)
Use the mean relevance score of all matching child objects.
max
Uses the highest relevance score of all matching child objects.
min
Uses the lowest relevance score of all matching child objects.
none
Do not use the relevance scores of matching child objects. The query assigns parent documents a score of0.
sum
Add together the relevance scores of all matching child objects.
ignore_unmapped
(Optional, Boolean) Indicates whether to ignore an unmappedpath and not return any documents instead of an error. Defaults tofalse.

Iffalse, Elasticsearch returns an error if thepath is an unmapped field.

You can use this parameter to query multiple indices that may not contain the fieldpath.

If you run ascript 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 thedrivers index with nestedmake andmodel 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 thedrivers 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 themake andmodel 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 anested 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 anested query that contains an innermust_not clause.

Tip

Use theinner_hits parameter to see which nested objects matched anested query.

For example, the following search uses an outernested query with an innermust_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"            }          ]        }      }    ]  }}
  1. This nested object matches the query. As a result, the search returns the object’s parent document as a hit.
  2. This nested object doesn’t match the query. Since another nested object in the same document does match the query, the search still returns the parent document as a hit.

To exclude documents with any nested objects that match thenested query, use an outermust_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"            }          ]        }      }    ]  }}

[8]ページ先頭

©2009-2025 Movatter.jp