目录
一、简介
前面一篇文章我们已经实现了es整合springboot项目,本篇文章将总结关于高级客户端API操作索引和文档的一些操作。
二、关于索引相关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的索引了。
三、关于文档相关API操作
【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详解。