Java操作ElasticSearch(二、文档的操作)
接着Java操作ElasticSearch(一、索引库的操作),继续学习文档的相关操作
添加文档
添加文档的步骤大致如下
- 从数据库查询文档数据
- 创建 IndexRequest 对象,并指定索引库名称
- 指定新增数据的 id
- 将新增的文档数据变成 JSON 格式
- 将 JSON 数据添加到 IndexRequest 中
- 发起请求,得到结果
如果需要从数据库查询数据,然后再添加进 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 查询
查询文档的步骤大致如下
- 创建 GetRequest 对象,并指定索引库名称、文档 id
- 发起请求,得到结果
- 从结果中得到 source,是 JSON 字符串
- 将 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 修改单个字段
步骤如下
- 创建 UpdateRequest 对象,指定索引库名称,文档 id
- 指定要修改的字段及属性值
- 发起请求
@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 来执行。
拿批量新增举例
- 从数据库查询文档数据
- 创建BulkRequest 对象
- 创建多个 IndexRequest 对象,组织文档数据,并添加到 BulkRequest 中
- 发起请求
@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
}


浙公网安备 33010602011771号