Update接口

你可以创建一个 UpdateRequest 并发送给 client

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();

或者也可以使用 prepareUpdate() 方法

client.prepareUpdate("ttl", "doc", "1")
        //这里是脚本。它也可以是存储中本地文件中,这种情况下,你需要使用ScriptService.ScriptType.FILE
        .setScript(new Script("ctx._source.gender = \"male\""  , ScriptService.ScriptType.INLINE, null, null))
        .get();

client.prepareUpdate("ttl", "doc", "1")
        .setDoc(jsonBuilder()
            .startObject()
                .field("gender", "male")
            .endObject())
        .get();

注意,不能同时使用 scriptdoc

使用脚本更新文档

Update接口允许提供一个脚本来更新文档:

UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1")
        .script(new Script("ctx._source.gender = \"male\""));
client.update(updateRequest).get();

合并的方式更新文档

Update接口允许传入一部分文档,并将之合并到一个已存在的文档中(简单的递归合并,对象的内部合并,替换键值对和数组),例:

UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
        .doc(jsonBuilder()
            .startObject()
                .field("gender", "male")
            .endObject());
client.update(updateRequest).get();

插入更新(Upsert)

更新的时候也支持upsert。如果文档不存在,upsert的元素会被建立一个索引:

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())
        //如果文档不存在,indexRequest中的元素就会被建立索引
        .upsert(indexRequest);
client.update(updateRequest).get();

如果 index/type/1 这个文档已经存在了,在这个操作之后我们会有一个这样的文档:

{
    "name"  : "Joe Dalton",
    "gender": "male" //这个字段是通过UpdateRequest添加的
}
如果 **index/type/1** 这个文档不存在,我们会得到一个新的文档:
{
    "name" : "Joe Smith",
    "gender": "male"
}