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,指定索引库名称和文档ID
    IndexRequest 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.准备Request
    GetRequest 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.准备Request
    DeleteRequest 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.准备Request
    IndexRequest 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.准备Request
    UpdateRequest 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;
    @Autowired
    private IItemService iItemService;

    // 新增/全量修改
    @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.准备Request
        IndexRequest request = new IndexRequest("items").id(itemDoc.getId());
        // 2.准备请求参数
        request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
        // 3.发送请求
        client.index(request, RequestOptions.DEFAULT);
    }

    // 查询
    @Test
    void testGetDoc() throws IOException {
        // 1.准备Request
        GetRequest 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);
    }

    // 删除
    @Test
    void testDeleteDoc() throws IOException {
        // 1.准备Request
        DeleteRequest request = new DeleteRequest("items", "317578");
        // 2.发送请求
        client.delete(request, RequestOptions.DEFAULT);
    }

    // 局部修改/增量修改
    @Test
    void testUpdateDoc() throws IOException {
        // 1.准备Request
        UpdateRequest request = new UpdateRequest("items", "317578");
        // 2.准备请求参数
        request.doc(
                "price", 88888
        );
        // 3.发送请求
        client.update(request, RequestOptions.DEFAULT);
    }

    @BeforeEach
    void setUp() {
        client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.100.212:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        if (client != null) {
            client.close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值