WARNING: Version 1.7 of Elasticsearch has passed its EOL date.
This documentation is no longer being maintained and may be removed. If you are running this version, we strongly advise you to upgrade. For the latest information, see the current release documentation.
Nested Type
editNested Type
editThe nested
type works like the object
type except
that an array of objects
is flattened, while an array of nested
objects
allows each object to be queried independently. To explain, consider this
document:
{ "group" : "fans", "user" : [ { "first" : "John", "last" : "Smith" }, { "first" : "Alice", "last" : "White" }, ] }
If the user
field is of type object
, this document would be indexed
internally something like this:
{ "group" : "fans", "user.first" : [ "alice", "john" ], "user.last" : [ "smith", "white" ] }
The first
and last
fields are flattened, and the association between
alice
and white
is lost. This document would incorrectly match a query
for alice AND smith
.
If the user
field is of type nested
, each object is indexed as a separate
document, something like this:
{ "user.first" : "alice", "user.last" : "white" } { "user.first" : "john", "user.last" : "smith" } { "group" : "fans" }
By keeping each nested object separate, the association between the
user.first
and user.last
fields is maintained. The query for alice AND
smith
would not match this document.
Searching on nested docs can be done using either the nested query or nested filter.
Mapping
editThe mapping for nested
fields is the same as object
fields, except that it
uses type nested
:
{ "type1" : { "properties" : { "user" : { "type" : "nested", "properties": { "first" : {"type": "string" }, "last" : {"type": "string" } } } } } }
changing an object
type to nested
type requires reindexing.
You may want to index inner objects both as nested
fields and as flattened
object
fields, eg for highlighting. This can be achieved by setting
include_in_parent
to true
:
{ "type1" : { "properties" : { "user" : { "type" : "nested", "include_in_parent": true, "properties": { "first" : {"type": "string" }, "last" : {"type": "string" } } } } } }
The result of indexing our example document would be something like this:
{ "user.first" : "alice", "user.last" : "white" } { "user.first" : "john", "user.last" : "smith" } { "group" : "fans", "user.first" : [ "alice", "john" ], "user.last" : [ "smith", "white" ] }
Nested fields may contain other nested fields. The include_in_parent
object
refers to the direct parent of the field, while the include_in_root
parameter refers only to the topmost “root” object or document.
The include_in_parent
and include_in_root
options do not apply
to geo_shape
fields, which are only ever
indexed inside the nested document.
Nested docs will automatically use the root doc _all
field only.