[[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 does not 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" } --------------------------------------------------