POST /company/branch/_bulk
{ "index": { "_id": "london" }}
{ "name": "London Westminster", "city": "London", "country": "UK" }
{ "index": { "_id": "liverpool" }}
{ "name": "Liverpool Central", "city": "Liverpool", "country": "UK" }
{ "index": { "_id": "paris" }}
{ "name": "Champs Élysées", "city": "Paris", "country": "France" }
Indexing Parents and Children
Indexing parent documents is no different from any other document. Parents don’t need to know anything about their children:
When indexing child documents, you must specify the ID of the associated parent document:
PUT /company/employee/1?parent=london (1)
{
"name": "Alice Smith",
"dob": "1970-10-24",
"hobby": "hiking"
}
-
This
employeedocument is a child of thelondonbranch.
This parent ID serves two purposes: it creates the link between the parent
and the child, and it ensures that the child document is stored on the same
shard as the parent.
In [routing-value], we explained how Elasticsearch uses a routing value,
which defaults to the _id of the document, to decide which shard a document
should belong to. The routing value is plugged into this simple formula:
shard = hash(routing) % number_of_primary_shards
However, if a parent ID is specified, it is used as the routing value
instead of the _id. In other words, both the parent and the child use the
same routing value—the _id of the parent—and so they are both stored
on the same shard.
The parent ID needs to be specified on all single-document requests:
when retrieving a child document with a GET request, or when indexing,
updating, or deleting a child document. Unlike a search request, which is
forwarded to all shards in an index, these single-document requests are
forwarded only to the shard that holds the document—if the parent ID is
not specified, the request will probably be forwarded to the wrong shard.
The parent ID should also be specified when using the bulk API:
POST /company/employee/_bulk
{ "index": { "_id": 2, "parent": "london" }}
{ "name": "Mark Thomas", "dob": "1982-05-16", "hobby": "diving" }
{ "index": { "_id": 3, "parent": "liverpool" }}
{ "name": "Barry Smith", "dob": "1979-04-01", "hobby": "hiking" }
{ "index": { "_id": 4, "parent": "paris" }}
{ "name": "Adrien Grand", "dob": "1987-05-11", "hobby": "horses" }
|
Warning
|
If you want to change the parent value of a child document, it is
not sufficient to just reindex or update the child document—the new parent
document may be on a different shard. Instead, you must first delete the old
child, and then index the new child.
|