一架梯子,一头程序猿,仰望星空!

Java Elasticsearch Update API


Elasticsearch Update API 根据文档ID更新文档内容,主要支持两种方式更新文档内容:通过脚本的方式更新和更新文档部分字段。

提示:如果被更新的文档不存在,也支持插入操作,通过upsert api实现。

创建Update Request

// 创建UpdateRequest请求,索引名=posts,文档ID=1
UpdateRequest request = new UpdateRequest(
        "posts", 
        "1");  

设置更新内容

UpdateRequest对象支持下面几种更新文档内容的方式,根据需要选择一种方式即可

脚本方式

通过ES 内置script脚本更新文档内容。

// 定义脚本参数
Map<String, Object> parameters = singletonMap("count", 4); 

// 创建inline脚本,使用painless语言,实现field字段 + count参数值
Script inline = new Script(ScriptType.INLINE, "painless",
        "ctx._source.field += params.count", parameters);  

// 设置脚本
request.script(inline);

map方式

通过map对象更新文档部分内容

// 通过map对象设置需要更新的字段内容
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("updated", new Date());
jsonMap.put("reason", "daily update");

// 设置更新内容
request.doc(jsonMap);

json字符串方式

通过json字符串方式更新文档部分内容

String jsonString = "{" +
        "\"updated\":\"2017-01-01\"," +
        "\"reason\":\"daily update\"" +
        "}";
request.doc(jsonString, XContentType.JSON);

upsert方式

通过Upsert方式更新文档内容,跟前面三种类似,支持json字符串、map、脚本方式,但是有一点区别,如果被更新的文档不存在,则会执行插入操作。

String jsonString = "{\"created\":\"2017-01-01\"}";
request.upsert(jsonString, XContentType.JSON); 

其他可选参数

设置路由

request.routing("routing"); 

timeout

设置请求超时时间

request.timeout(TimeValue.timeValueSeconds(1)); // 方式1:1秒
request.timeout("1s"); // 方式2:1秒

版本冲突重试

如果更新文档的时候出现版本冲突,重试几次。

request.retryOnConflict(3); 

并发控制

设置并发控制参数,新版的ES已经废弃老的version字段,详情请参考:ES基于乐观锁的并发控制

// 设置版本号
request.setIfSeqNo(2L); 
// 设置文档所在的主分区
request.setIfPrimaryTerm(1L);

同步执行请求

UpdateResponse updateResponse = client.update(
        request, RequestOptions.DEFAULT);

异步执行请求

client.updateAsync(request, RequestOptions.DEFAULT, new ActionListener<UpdateResponse>() {
            @Override
            public void onResponse(UpdateResponse updateResponse) {
              // 执行成功
            }

            @Override
            public void onFailure(Exception e) {
               // 执行失败
            }
        });

执行结果

// 索引名
String index = updateResponse.getIndex();
// 文档id
String id = updateResponse.getId();
// 版本号
long version = updateResponse.getVersion();
if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) {
    // 成功创建文档
} else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) {
    // 成功更新文档
}