ARTICLE · 978795
Spring Boot 操作 ES 文档 CRUD
Spring Boot 操作 ES 文档 CRUD
Elasticsearch 整合 Spring Boot(二):文档 CRUD 与批量请求
索引准备好之后,应用通常需要围绕 JSON 文档完成新增、更新、删除和查询。本篇使用 Elasticsearch 7.x High Level REST Client,演示三种写入方式、按 ID 查询、异步查询和 Bulk 批量请求。
新增文档
JSON 字符串
IndexRequest request = new IndexRequest("req_log").id("1");
request.source("{\"method\":\"GET\",\"path\":\"/api/post\"}",
XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
Map
Map<String, Object> source = new HashMap<>();
source.put("method", "GET");
source.put("path", "/api/post");
IndexRequest request = new IndexRequest("req_log").id("2").source(source);
client.index(request, RequestOptions.DEFAULT);
XContentBuilder
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject().field("method", "POST").field("times", 30).endObject();
IndexRequest request = new IndexRequest("req_log").id("3").source(builder);
client.index(request, RequestOptions.DEFAULT);
不指定 ID 时 ES 会自动生成文档 ID;需要幂等写入时应由业务方提供稳定 ID,并根据返回的 Result 判断是创建还是覆盖。
更新和删除
UpdateRequest update = new UpdateRequest("req_log", "1")
.doc("times", 80);
client.update(update, RequestOptions.DEFAULT);
DeleteRequest delete = new DeleteRequest("req_log", "1");
client.delete(delete, RequestOptions.DEFAULT);
更新不存在的文档会失败;如果业务需要,可以使用 docAsUpsert 实现不存在时新增,但要明确覆盖策略。
按 ID 查询
GetRequest request = new GetRequest("req_log", "1");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
if (response.isExists()) {
Map<String, Object> source = response.getSourceAsMap();
}
异步查询
client.getAsync(request, RequestOptions.DEFAULT,
new ActionListener<GetResponse>() {
@OverridepublicvoidonResponse(GetResponse response){ }
@OverridepublicvoidonFailure(Exception e){ }
});
异步回调中不要阻塞主线程;应记录异常并将结果转换为应用层对象。
Bulk 批量请求
BulkRequest bulk = new BulkRequest();
bulk.add(new IndexRequest("req_log").id("4").source(source));
bulk.add(new DeleteRequest("req_log", "1"));
BulkResponse response = client.bulk(bulk, RequestOptions.DEFAULT);
批量响应需要逐项检查 BulkItemResponse#isFailed()。批次不宜无限增大,应结合文档大小、网络延迟和集群写入能力设置合理上限。
小结
文档 API 负责数据写入和读取,Bulk 负责降低大量请求的网络开销。生产代码还应补充超时、重试、幂等、异常记录和版本冲突处理。