欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > ElasticSearch JavaRestClient之文档的CRUD

ElasticSearch JavaRestClient之文档的CRUD

2025/9/15 10:30:15 来源:https://blog.csdn.net/2301_80093566/article/details/145180478  浏览:    关键词:ElasticSearch JavaRestClient之文档的CRUD

一、文档新增(Index)

新增文档分为三个主要步骤:

  1. 准备 request 对象
  2. 准备请求体(参数),如果需要;
  3. 发送请求

新增文档的 Java 客户端代码与请求步骤是完全一致的。具体步骤如下:

  • 请求对象IndexRequest
  • 方法调用index 方法
  • 请求体:文档内容(通常为 JSON 格式)

@Test
void testIndexDoc() throws IOException {// 0.准备文档数据// 0.1 根据id查询数据库数据Item item = iItemService.getById(317578L);// 0.2把数据库数据转为文档数据ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class)// 1.准备Request,指定索引库名称和文档IDIndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 2.准备请求参数request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);
}

新增文档时,不仅可以进行新增,还可以进行覆盖操作(如果文档 ID 已经存在)。



二、文档查询(Get)

查询文档时,Java 客户端代码与删除操作非常相似,但需要做一些额外的处理来解析结果。

步骤

  1. 准备 request 对象GetRequest
  2. 调用 get 方法:获取查询结果
  3. 处理响应结果:从响应结果中提取 source 字段

查询文档的 Java 客户端代码如下:
  • 请求对象GetRequest
  • 方法调用get 方法
  • 结果解析:获取 source 字段的值
@Test
void testGetDoc() throws IOException {// 1.准备RequestGetRequest request = new GetRequest("items", "317578");	// 索引库名称和文档ID// 2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析响应结果,提取 source 字段String json = response.getSourceAsString();	// 获取源数据ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("doc = " + doc);
}

响应结果: 查询返回的结果是一个 JSON 文档,其中包含 source 字段,source 即原始存储的文档内容。




三、文档删除(Delete)

删除文档的 API 设计与查询非常类似。区别仅在于请求方法变为 delete

步骤

  1. 准备 request 对象DeleteRequest
  2. 调用 delete 方法:删除文档

删除文档的 Java 客户端代码如下:

  • 请求对象DeleteRequest
  • 方法调用delete 方法
 @Test
void testDeleteDoc() throws IOException {// 1.准备RequestDeleteRequest request = new DeleteRequest("items", "317578");	// 索引库名称和文档ID// 2.发送请求client.delete(request, RequestOptions.DEFAULT);
}

删除成功后,通常不会返回文档内容,但可以通过查询操作来确认删除操作是否成功,可以看到,查询操作返回 404 状态码,说明删除成功。



四、文档修改

文档修改分为全量更新和局部更新。

4.1 全量更新(Index 更新)

全量更新是指提供一个完整的文档替换原有文档。操作与新增文档相似,但如果文档 ID 已存在,ES 会先删除旧文档,再插入新文档。

步骤

  1. 准备 request 对象IndexRequest(与新增相同)
  2. 方法调用index 方法
  3. 请求体:新文档的内容
@Test
void testIndexDoc() throws IOException {// 0.准备文档数据// 0.1 根据id查询数据库数据Item item = iItemService.getById(317578L);// 0.2把数据库数据转为文档数据ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);// 文档存在时,修改文档中价格字段(若文档不存在,则是新增操作)itemDoc.setPrice(99999);// 1.准备RequestIndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 2.准备请求参数request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);
}

如果文档 ID 已存在,执行时会覆盖原文档。




4.2 局部更新(Update)

局部更新指只修改文档中的部分字段,不会覆盖整个文档。在 Java 客户端中,局部更新需要使用 UpdateRequest

步骤

  1. 准备 request 对象UpdateRequest
  2. 请求体:指定要更新的字段
  3. 调用 update 方法:执行更新操作

局部更新的 Java 客户端代码如下:

  • 请求对象UpdateRequest
  • 方法调用update 方法
@Test
void testUpdateDoc() throws IOException {// 1.准备RequestUpdateRequest request = new UpdateRequest("items", "317578");// 2.准备请求参数request.doc("price", 88888);// 3.发送请求client.update(request, RequestOptions.DEFAULT);
}

局部更新不需要提供完整的文档,只需提供要更新的字段。



五、API 使用总结与规律

  1. 初始化请求对象
    • 新增文档:IndexRequest
    • 查询文档:GetRequest
    • 删除文档:DeleteRequest
    • 修改文档(全量更新):IndexRequest
    • 局部更新:UpdateRequest
  2. 请求方法
    • 新增文档:index() 方法
    • 查询文档:get() 方法
    • 删除文档:delete() 方法
    • 修改文档:index() 方法(全量更新),update() 方法(局部更新)
  3. 请求体
    • 新增和全量更新需要提供完整的文档内容。
    • 局部更新只需要提供更新的字段。
  4. 响应处理
    • 查询文档时,需要提取响应中的 source 字段。
    • 删除文档时,通常没有返回文档内容,只有操作成功与否的状态。
    • 修改文档时,根据操作结果判断是新增还是更新。



六、示例代码

以下是一个完整的示例,展示了查询、删除、修改文档的代码实现:

@SpringBootTest(properties = "spring.profiles.active=local")
public class ElasticTest {private RestHighLevelClient client;@Autowiredprivate IItemService iItemService;// 新增/全量修改@Testvoid testIndexDoc() throws IOException {// 0.准备文档数据// 0.1 根据id查询数据库数据Item item = iItemService.getById(317578L);// 0.2把数据库数据转为文档数据ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);// 文档存在时,修改文档中价格字段itemDoc.setPrice(99999);// 1.准备RequestIndexRequest request = new IndexRequest("items").id(itemDoc.getId());// 2.准备请求参数request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);}// 查询@Testvoid testGetDoc() throws IOException {// 1.准备RequestGetRequest request = new GetRequest("items", "317578");// 2.发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析响应结果String json = response.getSourceAsString();ItemDoc doc = JSONUtil.toBean(json, ItemDoc.class);System.out.println("doc = " + doc);}// 删除@Testvoid testDeleteDoc() throws IOException {// 1.准备RequestDeleteRequest request = new DeleteRequest("items", "317578");// 2.发送请求client.delete(request, RequestOptions.DEFAULT);}// 局部修改/增量修改@Testvoid testUpdateDoc() throws IOException {// 1.准备RequestUpdateRequest request = new UpdateRequest("items", "317578");// 2.准备请求参数request.doc("price", 88888);// 3.发送请求client.update(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.100.212:9200")));}@AfterEachvoid tearDown() throws IOException {if (client != null) {client.close();}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词