119 lines
3.6 KiB
Plaintext
119 lines
3.6 KiB
Plaintext
[[java-update-api]]
|
|
== Update API
|
|
|
|
|
|
You can either create an `UpdateRequest` and send it to the client:
|
|
|
|
[source,java]
|
|
--------------------------------------------------
|
|
UpdateRequest updateRequest = new UpdateRequest();
|
|
updateRequest.index("index");
|
|
updateRequest.type("type");
|
|
updateRequest.id("1");
|
|
updateRequest.doc(jsonBuilder()
|
|
.startObject()
|
|
.field("gender", "male")
|
|
.endObject());
|
|
client.update(updateRequest).get();
|
|
--------------------------------------------------
|
|
|
|
Or you can use `prepareUpdate()` method:
|
|
|
|
[source,java]
|
|
--------------------------------------------------
|
|
client.prepareUpdate("ttl", "doc", "1")
|
|
.setScript(new Script("ctx._source.gender = \"male\"" <1> , ScriptService.ScriptType.INLINE, null, null))
|
|
.get();
|
|
|
|
client.prepareUpdate("ttl", "doc", "1")
|
|
.setDoc(jsonBuilder() <2>
|
|
.startObject()
|
|
.field("gender", "male")
|
|
.endObject())
|
|
.get();
|
|
--------------------------------------------------
|
|
<1> Your script. It could also be a locally stored script name.
|
|
In that case, you'll need to use `ScriptService.ScriptType.FILE`
|
|
<2> Document which will be merged to the existing one.
|
|
|
|
Note that you can't provide both `script` and `doc`.
|
|
|
|
[[java-update-api-script]]
|
|
=== Update by script
|
|
|
|
The update API allows to update a document based on a script provided:
|
|
|
|
[source,java]
|
|
--------------------------------------------------
|
|
UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1")
|
|
.script(new Script("ctx._source.gender = \"male\""));
|
|
client.update(updateRequest).get();
|
|
--------------------------------------------------
|
|
|
|
|
|
[[java-update-api-merge-docs]]
|
|
=== Update by merging documents
|
|
|
|
The update API also support passing a partial document, which will be merged into the existing document (simple
|
|
recursive merge, inner merging of objects, replacing core "keys/values" and arrays). For example:
|
|
|
|
[source,java]
|
|
--------------------------------------------------
|
|
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
|
|
.doc(jsonBuilder()
|
|
.startObject()
|
|
.field("gender", "male")
|
|
.endObject());
|
|
client.update(updateRequest).get();
|
|
--------------------------------------------------
|
|
|
|
|
|
[[java-update-api-upsert]]
|
|
=== Upsert
|
|
|
|
There is also support for `upsert`. If the document already exists, the content of the `upsert`
|
|
element will be used to index the fresh doc:
|
|
|
|
[source,java]
|
|
--------------------------------------------------
|
|
IndexRequest indexRequest = new IndexRequest("index", "type", "1")
|
|
.source(jsonBuilder()
|
|
.startObject()
|
|
.field("name", "Joe Smith")
|
|
.field("gender", "male")
|
|
.endObject());
|
|
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
|
|
.doc(jsonBuilder()
|
|
.startObject()
|
|
.field("gender", "male")
|
|
.endObject())
|
|
.upsert(indexRequest); <1>
|
|
client.update(updateRequest).get();
|
|
--------------------------------------------------
|
|
<1> If the document does not exist, the one in `indexRequest` will be added
|
|
|
|
If the document `index/type/1` already exists, we will have after this operation a document like:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
{
|
|
"name" : "Joe Dalton",
|
|
"gender": "male" <1>
|
|
}
|
|
--------------------------------------------------
|
|
<1> This field is added by the update request
|
|
|
|
If it does not exist, we will have a new document:
|
|
|
|
[source,js]
|
|
--------------------------------------------------
|
|
{
|
|
"name" : "Joe Smith",
|
|
"gender": "male"
|
|
}
|
|
--------------------------------------------------
|
|
|
|
|
|
|
|
|