一、RestClient
1.1 初识RestClient
RestClient是一个用于测试和调试RESTful API的工具,它可以作为浏览器的插件或独立应用程序使用。使用RestClient,您可以轻松地发送HTTP请求并检查响应,以确保API按预期工作。您可以设置请求的各种参数,例如HTTP方法、请求头、请求体和URL参数等。它还支持OAuth1、OAuth2、Basic Auth和Digest Auth等身份验证方法,并且可以显示响应的HTTP状态码、标头和响应正文等信息。RestClient是一个非常方便的工具,可以帮助开发人员快速、准确地测试和调试RESTful API。
1.2 基本操作
1.2.1 分析数据结构
mapping要考虑的问题:字段名、数据类型、是否参与搜索、是否分词、如果分词,分词器是什么;
PUT /hotel
{
"mappings": {
"properties": {
"字段名": {
"type": "数据类型",
# 是否参与搜索
"index": false,
# 如果不需要分词则不写analyzer
"analyzer": "分词器",
# 如果参与联合搜索添加copy_to字段,
"copy_to": "指定字段"
},
# 联合字段
"all":{
"type": "text",
"analyzer": "分词器"
}
}
}
}
1.2.2 初始化JavaRestClient
- 引入es的RestHighLevelClient依赖
<!--elasticsearch依赖-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.12.1</version>
</dependency>
- 覆盖默认es版本
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.12.1</elasticsearch.version> </properties>
- 初始化RestHighLevelClient:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
HttpHost.create("http://IP地址:9200")
)
);
1.2.3 操作索引库
- 创建索引库
//创建RestHighLevelClient对象
private RestHighLevelClient client;
@Test
void testCreateHotelIndex() throws IOException {
//初始化RestHighLevelClient
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://IP地址:9200")
));
// 1.创建Request对象
CreateIndexRequest request = new CreateIndexRequest("索引库名称");
// 2.请求参数
//source第一个参数是创建索引库的DSL语句,第二个参数是指定数据类型
//XContentType.JSON指定数据类型为JSON
request.source("", XContentType.JSON);
// 3.发起请求
//indices索引库操作
//create(request对象, 请求参数)创建操作
client.indices().create(request, RequestOptions.DEFAULT);
//关闭RestHighLevelClient
this.client.close();
}
- 查询索引库
//创建RestHighLevelClient对象
private RestHighLevelClient client;
@Test
void testExistsHotelIndex() throws IOException {
//初始化RestHighLevelClient
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://IP地址:9200")
));
// 1.创建Request对象
GetIndexRequest request = new GetIndexRequest("索引库名称");
// 2.发起请求
//indices索引库操作
//exists(request对象, 请求参数)存在量词,返回值为布尔值
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
//3. 输出结果
System.out.println(exists);
//关闭RestHighLevelClient
this.client.close();
}
- 删除索引库
//创建RestHighLevelClient对象
private RestHighLevelClient client;
@Test
void testExistsHotelIndex() throws IOException {
//初始化RestHighLevelClient
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://IP地址:9200")
));
// 1.创建Request对象
DeleteIndexRequest request = new DeleteIndexRequest("索引库名称");
// 2.发起请求
//indices索引库操作
//delete(request对象, 请求参数)删除操作
client.indices().delete(request, RequestOptions.DEFAULT);
//关闭RestHighLevelClient
this.client.close();
}
- 优化
因为每次都要进行初始化和关闭RestHighLevelClient的操作,可以通过@BeforeEach和@AfterEach注解在每个方法执行前后添加操作,例如:
private RestHighLevelClient client;
@BeforeEach
void setUp() {
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://IP地址:9200")
));
}
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
1.2.4 操作文档
- 新增文档
@Test
void testAddDocument() throws IOException {
//sql中的酒店实体类
Hotel hotel = hotelService.getById(字段ID);
//es中的酒店实体类
HotelDoc hotelDoc = new HotelDoc(索引库名称);
//1.准备Request对象
IndexRequest request = new IndexRequest("索引库名称").id(hotel.getId().toString());
//2.准备JSON文档
request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);
//3.发送请求
client.index(request,RequestOptions.DEFAULT);
}
- 根据id查询文档
@Test
void testGetDocumentById() throws IOException {
//1.创建request对象
GetRequest request = new GetRequest("索引库名称","字段ID");
//2.发送请求,得到结果
GetResponse response = client.get(request,RequestOptions.DEFAULT);
//3.解析结果
//getSourceAsString():转换成字符串
String json = response.getSourceAsString();
//4.反序列化
//parseObject(数据,实体类.class);
HotelDoc hotelDoc = JSON.parseObject(json,HotelDoc.class);
//5.打印结果
System.out.println(hotelDoc);
}
- 更新文档
@Test
void testUpdateDocumentById() throws IOException {
//1.创建request对象
UpdateRequest request = new UpdateRequest("索引库名","字段ID");
//2.准备参数,每2个参数为一对 key value
request.doc(
"属性名","属性值"
);
//3.更新文档
client.update(request,RequestOptions.DEFAULT);
}
- 删除文档
void testDeleteDocumentById() throws IOException {
//1.创建request对象
DeleteRequest request = new DeleteRequest("索引库名","字段ID");
//2.发送请求,删除对象
client.delete(request,RequestOptions.DEFAULT);
}