夜雨聆风学习资料网

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 负责降低大量请求的网络开销。生产代码还应补充超时、重试、幂等、异常记录和版本冲突处理。

相关学习资料

返回首页浏览学习资料