Elasticsearch之使用RestClient实现对数据的更新操作
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch之使用RestClient实现对数据的更新操作相关的知识,希望对你有一定的参考价值。
版本:elasticsearch 7.13.4
1. 声明
当前内容主要用于本人学习和测试Elasticsearch的对数据的更新操作,主要参考官方文档
主要内容(JSON为fastjson的使用):
- 直接更新文档(更新文档中的所有数据)
- 更新文档中的部分数据
- 并发更新(基于if_seq_no=值&if_primary_term=值方式更新,非version)
- 可以在更新的后面使用
?refresh
来强制刷新内存数据
当前内容基于前面的博文
2. 直接更新文档(该方法和add一样)
/**
*
* @author hy
* @createTime 2021-07-31 11:10:39
* @description 修改数据操作
* @param restClient
* @throws IOException
*
*/
private static void updateData(RestClient restClient) throws IOException {
Request request = new Request("PUT", "/book/java/1");
Book book = new Book();
book.setBookName("java ee");
book.setId(2);
book.setPrice(66.6);
// 注意这里出现了问题,查询后的数据中的字段count消失了,所以这里应该使用部分更新操作
String bookJson = JSON.toJSONString(book);
request.setJsonEntity(bookJson);
Response response = restClient.performRequest(request);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(response);
// Response{requestLine=PUT /book/java/1 HTTP/1.1, host=http://127.0.0.1:9200,
// response=HTTP/1.1 200 OK}
}
更新前
更新后
说明这种更新方式会直接替换文档中的全部内容
2.更新文档的部分内容
只更新_id=1中的bookName属性内容
/**
*
* @author hy
* @createTime 2021-07-31 11:13:25
* @description 部分数据的更新操作
* @param restClient
* @throws IOException
*
*/
private static void updateDataOnPartAttr(RestClient restClient) throws IOException {
// 注意这里不允许使用PUT方法,只允许POST
Request request = new Request("POST", "/book/java/1/_update");
String json = "{\\"doc\\":{\\"bookName\\":\\"java update\\"}}";
request.setJsonEntity(json);
Response response = restClient.performRequest(request);
System.out.println(response);
// Response{requestLine=POST /book/java/1/_update HTTP/1.1,
// host=http://localhost:9200, response=HTTP/1.1 200 OK}
}
更新后结果
3. 并发更新
/**
*
* @author hy
* @createTime 2021-07-31 13:21:10
* @description 在并发控制下的版本更新
* @param restClient
* @throws IOException
*
*/
private static void updateDataWhenConcurrency(RestClient restClient) throws IOException {
// 注意这里不允许使用PUT方法,只允许POST
// Request request = new Request("POST", "/book/java/1/_update?version=2");
// 错误不能使用version方式控制乐观并发,直接报错了
// {"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation
// Failed: 1: internal versioning can not be used for optimistic concurrency
// control. Please use `if_seq_no` and `if_primary_term`
// instead;"}],"type":"action_request_validation_exception","reason":"Validation
// Failed: 1: internal versioning can not be used for optimistic concurrency
// control. Please use `if_seq_no` and `if_primary_term`
// instead;"},"status":400}
// Request request = new Request("POST", "/book/java/1/_update?if_seq_no=2");
// 错误,存在if_seq_no属性,但是又需要primary term is [0]
// {"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation
// Failed: 1: ifSeqNo is set, but primary term is
// [0];"}],"type":"action_request_validation_exception","reason":"Validation
// Failed: 1: ifSeqNo is set, but primary term is [0];"},"status":400}
Request request = new Request("POST", "/book/java/1/_update?if_seq_no=6&if_primary_term=2");
String json = "{\\"doc\\":{\\"bookName\\":\\"java update 3\\"}}";
request.setJsonEntity(json);
Response response = restClient.performRequest(request);
System.out.println(response);
// 所以在当前7.13.4版本中是不可以使用version方式控制乐观并发的,必须使用if_seq_no=实际值和if_primary_termm=实际值方式来进行并发更新操作
// Response{requestLine=POST /book/java/1/_update?if_seq_no=2&if_primary_term=1
// HTTP/1.1, host=http://localhost:9200, response=HTTP/1.1 200 OK}
}
1.之前的使用version方式是无法执行乐观并发操作
2. 现在修改为if_seq_no和if_primary_term一起使用来控制,如果使用错误的话就无法更新
执行结果
测试成功
以上是关于Elasticsearch之使用RestClient实现对数据的更新操作的主要内容,如果未能解决你的问题,请参考以下文章
elasticsearch基本操作之--使用QueryBuilders进行查询
java使用elasticsearch进行模糊查询之must使用