首页 > 编程语言 >Java操作ElasticSearch(二、文档的操作)

Java操作ElasticSearch(二、文档的操作)

时间:2022-12-06 22:22:50浏览次数:67  
标签:Java request response JSON ElasticSearch user 操作 文档 id

接着Java操作ElasticSearch(一、索引库的操作),继续学习文档的相关操作

添加文档

添加文档的步骤大致如下

  1. 从数据库查询文档数据
  2. 创建 IndexRequest 对象,并指定索引库名称
  3. 指定新增数据的 id
  4. 将新增的文档数据变成 JSON 格式
  5. 将 JSON 数据添加到 IndexRequest 中
  6. 发起请求,得到结果

如果需要从数据库查询数据,然后再添加进 es 索引库,就需要在单元测试类中初始化 UserService 对象

private UserService userService = new UserService();

  

例子1,添加文档(没有从数据库读,自己手写一条 JSON 格式数据)

@Test
public void test05() throws IOException {
    // 获取客户端对象,指定索引库名称
    IndexRequest request = new IndexRequest("user");
    // 设置文档编号
    request.id("1");
    // 设置文档数据信息
    String jsonString = "{\n" +
            "  \"name\": \"李连杰\",\n" +
            "  \"age\": 25,\n" +
            "  \"gender\": \"男\",\n" +
            "  \"note\": \"李连杰正在打架~\"\n" +
            "}";
    request.source(jsonString, XContentType.JSON);
    // 发送请求给es,并接收响应结果
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    // 打印响应结果
    System.out.println(response.status()); // CREATED
}

 

 

例子2,添加文档(从数据库读一条数据)

@Test
public void test06() throws IOException {
    // 从数据库查询一条记录
    User user = userService.findById(2L);
    // 获取客户端对象,指定索引库名称
    IndexRequest request = new IndexRequest("user");
    // 设置文档编号
    request.id(user.getId() + "");
    // 转换为 JSON 格式字符串
    String jsonString = JSON.toJSONString(user);
    System.out.println(jsonString); // {"age":21,"gender":"男","id":2,"name":"李四","note":"李四同学在传智学Java"}
    // 设置文档数据信息
    request.source(jsonString, XContentType.JSON);
    // 发送请求给es,并接收响应结果
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    // 打印响应结果
    System.out.println(response.status()); // CREATED
}

 

 

查询文档

首先这里介绍一下根据 id 查询

查询文档的步骤大致如下

  1. 创建 GetRequest 对象,并指定索引库名称、文档 id
  2. 发起请求,得到结果
  3. 从结果中得到 source,是 JSON 字符串
  4. 将 JSON 字符串反序列化为对象
@Test
public void test07() throws IOException {
    // 获取文档对象,语义描述
    GetRequest request = new GetRequest("user", "2");
    // 发送请求,获取文档对象
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 获取响应结果中的数据信息
    String sourceAsString = response.getSourceAsString();
    System.out.println(sourceAsString); // {"age":21,"gender":"男","id":2,"name":"李四","note":"李四同学在传智学Java"}
    // 解析响应结果字符串
    User user = JSON.parseObject(sourceAsString, User.class);
    System.out.println(user); // User(id=2, name=李四, age=21, gender=男, note=李四同学在传智学Java)
}

 

修改文档

新增时,如果 id 一致就会覆盖旧的数据,实现修改,但是如果我们只修改文档中的某个字段,可以使用另外的 api

例子1,新增时,id一致,覆盖旧的数据

@Test
public void test05() throws IOException {
    // 获取客户端对象,指定索引库名称
    IndexRequest request = new IndexRequest("user");
    // 设置文档编号
    request.id("1");
    // 设置文档数据信息
    String jsonString = "{\n" +
            "  \"name\": \"李连杰\",\n" +
            "  \"age\": 29,\n" +
            "  \"gender\": \"男\",\n" +
            "  \"note\": \"李连杰正在喝酒~\"\n" +
            "}";
    request.source(jsonString, XContentType.JSON);
    // 发送请求给es,并接收响应结果
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    // 打印响应结果
    System.out.println(response.status()); // OK
}

 

 

例子2,使用其他的 api 修改单个字段

步骤如下

  1. 创建 UpdateRequest 对象,指定索引库名称,文档 id
  2. 指定要修改的字段及属性值
  3. 发起请求
@Test
public void test08() throws IOException {
    // 获取文档对象,语义描述
    UpdateRequest request = new UpdateRequest("user", "1");
    // 设置需要修改的字段信息
    request.doc("name", "成龙");
    // 发送请求,获取文档对象
    UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
    // 打印响应结果
    System.out.println(response.getResult()); // UPDATED
}

 

 

删除文档

直接根据 id 删除即可

@Test
public void test09() throws IOException {
    // 获取文档对象,语义描述
    DeleteRequest request = new DeleteRequest("user", "2");
    // 发送请求,获取文档对象
    DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
    // 打印响应结果
    System.out.println(response.getResult()); // DELETED
}

 

 

批处理

如果我们需要把数据库中的所有用户信息都导入索引库,可以批量查询出多个用户,但是刚刚的新增文档是一次新增一个文档,这样效率太低了

因此 ElasticSearch 提供了批处理的方案:BulkRequest

一个 BulkRequest 可以在一次请求中执行多个 新增、更新、删除请求。

所以,BulkRequest 就是把多个其它增、删、改请求整合,然后一起发送到 ES 来执行。

拿批量新增举例

  1. 从数据库查询文档数据
  2. 创建BulkRequest 对象
  3. 创建多个 IndexRequest 对象,组织文档数据,并添加到 BulkRequest 中
  4. 发起请求
@Test
public void test10() throws IOException {
    // 从数据库查询所有数据
    List<User> list = userService.findAll();
    BulkRequest bulkRequest = new BulkRequest("user");
    for (User user : list) {
        IndexRequest request = new IndexRequest();
        request.id(user.getId().toString());
        String jsonString = JSON.toJSONString(user);
        request.source(jsonString, XContentType.JSON);
        bulkRequest.add(request);
    }
    BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(responses.status()); // OK
}

 

标签:Java,request,response,JSON,ElasticSearch,user,操作,文档,id
From: https://www.cnblogs.com/xulinjun/p/16960946.html

相关文章