目录
一、简介
二、关于索引相关API操作
三、关于文档相关API操作
四、总结
前面一篇文章我们已经实现了es整合springboot项目,本篇文章将总结关于高级客户端API操作索引和文档的一些操作。
在es中,很多API操作都是基于RestHighLevelClient对象来进行,下面我们通过几个常见示例说明其用法。
【a】创建一个名为"student_info"的索引库
主要分为下面三个步骤:
创建索引请求;执行索引请求;获取索引请求响应结果; @SpringBootTest class WshElasticsearchApiApplicationTests { @Autowired private RestHighLevelClient restHighLevelClient; /** * 测试创建索引 */ @Test void createIndex() { //创建索引请求 CreateIndexRequest studentInfoIndexRequest = new CreateIndexRequest("student_info"); //执行请求 try { //获取响应 CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(studentInfoIndexRequest, RequestOptions.DEFAULT); System.out.println(createIndexResponse); } catch (IOException e) { e.printStackTrace(); } } }执行单元测试:
如上图,成功创建索引。
【b】判断索引库是否存在
@Test void existsIndex() { //创建获取索引的请求 GetIndexRequest getIndexRequest = new GetIndexRequest("student_info"); boolean exists = false; try { //执行请求,获取响应结果 exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(exists); }控制台输出日志如下:
可以看到,我们的索引库student_info存在。
【c】删除索引库
@Test void deleteIndex() { //创建删除索引的请求 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("student_info"); //执行请求,获取响应结果 AcknowledgedResponse acknowledgedResponse = null; try { acknowledgedResponse = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(acknowledgedResponse); }控制台输出日志如下:
可以看到,成功删除索引库student_info,es-head中也查看不到student_info的索引了。
【a】添加文档
首先,我们先创建一个"student_info"的索引库:
创建完成后,我们需要创建一个实体类Student用于模拟插入数据:
package com.wsh.elasticsearch.wshelasticsearchapi.entity; import org.springframework.stereotype.Component; @Component public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }pom.xml文件中添加json转化工具包fastjson依赖,后面保存数据时需要用到:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>新建文档:
@Test void createDocument() { //创建对象 Student student = new Student("张三", 30); //创建索引请求 IndexRequest request = new IndexRequest("student_info"); //设置ID request.id("1"); //设置超时 request.timeout(TimeValue.timeValueSeconds(1)); //将数据放入请求(json格式) request.source(JSON.toJSONString(student), XContentType.JSON); //客户端发送请求 IndexResponse response = null; try { //获取响应 response = restHighLevelClient.index(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(response.toString()); System.out.println(response.status()); }控制台日志输出如下:
IndexResponse[index=student_info,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}] CREATED可以看到数据的状态为CREATE创建状态,创建完成后,我们去es-head中查看索引数据:
可见,文档成功插入到索引库中。
【b】判断文档是否存在
@Test void existsDocument() { //创建获取文档请求 GetRequest request = new GetRequest("student_info", "1"); boolean exists = false; try { exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(exists); }控制台日志输出如下:
可见,ID为1的文档记录存在索引库中。
【c】获取文档的信息
@Test void getDocument() { //创建获取文档请求 GetRequest request = new GetRequest("student_info", "1"); GetResponse response = null; try { //获取响应 response = restHighLevelClient.get(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println("response: " + response); System.out.println("id: " + response.getId()); System.out.println("index: " + response.getIndex()); System.out.println("source: " + response.getSource()); System.out.println("source string: " + response.getSourceAsString()); System.out.println("version: " + response.getVersion()); System.out.println("fields: " + response.getFields()); }控制台日志输出如下:
response: {"_index":"student_info","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":30,"name":"张三"}} id: 1 index: student_info source: {name=张三, age=30} source string: {"age":30,"name":"张三"} version: 1 fields: {}【d】更新文档的信息
@Test void updateDocument() { //创建更新文档请求 UpdateRequest request = new UpdateRequest("student_info", "1"); //设置超时 request.timeout("1s"); //创建对象 Student student = new Student("李四", 40); //设置请求体内容 request.doc(JSON.toJSONString(student), XContentType.JSON); UpdateResponse response = null; try { //执行更新请求,获取响应结果 response = restHighLevelClient.update(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(response); }控制台日志输出如下:
UpdateResponse[index=student_info,type=_doc,id=1,version=2,seqNo=1,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]更新完成后,我们去es-head中查看索引数据:
可见,数据成功被更新。
【e】删除文档信息
@Test void deleteDocument() { //创建删除请求 DeleteRequest request = new DeleteRequest("student_info", "1"); request.timeout("1s"); DeleteResponse response = null; try { //执行删除请求,获取响应结果 response = restHighLevelClient.delete(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } System.out.println(response); }控制台日志输出如下:
DeleteResponse[index=student_info,type=_doc,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]删除完成后,我们去es-head中查看索引数据:
可见,数据成功被删除。
【f】批量插入数据
@Test void bulkRequest() { //创建批处理请求 BulkRequest request = new BulkRequest(); //设置超时 request.timeout("15s"); //创建集合 List<Student> studentList = new ArrayList<>(); studentList.add(new Student("张三", 10)); studentList.add(new Student("李四", 20)); studentList.add(new Student("王五", 30)); studentList.add(new Student("赵六", 40)); studentList.add(new Student("田七", 50)); for (int i = 0; i < studentList.size(); i++) { Student student = studentList.get(i); IndexRequest indexRequest = new IndexRequest("student_info") .id((i + 1) + "") .source(JSON.toJSONString(student), XContentType.JSON); request.add(indexRequest); } BulkResponse response = null; try { response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } //是否失败 false表示成功 System.out.println(response.hasFailures()); //状态 System.out.println(response.status()); }控制台日志输出如下:
插入完成后,我们去es-head中查看索引数据:
可见,批量插入数据成功。
同理,批量更新、批量删除只是构造的xxxRequest不同而已,其他基本一致。
本篇文章主要总结了es高级客户端API操作索引以及文档的一些操作,通过详细的示例说明其用法。大体的步骤基本一致:
第一步,先构造xxxRequest请求对象,可以设置超时等信息;第二部,通过restHighLevelClient对象执行对应的请求;第三步,获取执行请求的响应结果进行分析;更多详细的高级API操作可参考elasticsearch官方文档进行学习,下一篇文章我们将总结一些关于查询相关的API详解。