接着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 }
标签:Java,request,response,JSON,ElasticSearch,user,操作,文档,id From: https://www.cnblogs.com/xulinjun/p/16960946.html