目录
在test里测试一下各个API。
打开es,也运行es-head,方便观察。
一、关于索引的API详解
这里的client对ES发出请求,就相当于我们的kibana。
1.1 声明客户端
@SpringBootTest
class SpringEsApiApplicationTests {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client; //加上@@Qualifier,就可以用client去替换restHighLevelClient
// client就相当于kibana
@Test
void contextLoads() {
}
}
1.2 创建索引
官方说明:Create Index API | Java REST Client [7.17] | ElasticCreate Index API | Java REST Client [7.15] | ElasticCreate Index API | Java REST Client [7.17] | Elastic
PS:看文档的时候注意选择合适的client版本,我这里看的就是7.15版本的
主要就是两步:
(1)定义 创建索引请求(CreateIndexRequest)
(2)client发送请求,返回值是响应的对象
//测试 创建索引 Request
@Test
void testCreateIndex() throws IOException {
//1.定义 创建索引请求(CreateIndexRequest)
CreateIndexRequest request = new CreateIndexRequest("test2");
//2.client发送请求,获得响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
运行。
通过命令行的返回值可以看到返回了创建索引的response:
去head中查看,创建成功。
1.3 获取文档 / 判断文档是否存在
官方:Index Exists API | Java REST Client [7.15] | Elastic
//测试 获取索引 Request
@Test
void testGetIndex() throws IOException {
//1.定义 获取索引请求
GetIndexRequest request = new GetIndexRequest("test2");
//2.client发送请求,返回布尔值
boolean exists = client.indices().exists(request,RequestOptions.DEFAULT);
System.out.println(exists);
}
运行。
1.4 删除索引
官方文档:Delete Index API | Java REST Client [7.15] | Elastic
//测试 删除索引
@Test
void testDeleteIndex() throws IOException {
//1.定义 删除索引请求
DeleteIndexRequest request = new DeleteIndexRequest("test2");
//2.client发送请求,获得响应
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged()); //响应的状态为true就代表成功删除
}
运行单元测试。
命令行显示删除成功,再来head看一下。
二、关于文档的API详解
(1)便于测试文档,我们先新建一个索引user。
(2)在如下图位置中新建一个pojo文件夹,新建一个User类,其对象就相当于我们的文档。
(3)因为对es发请求需要用json的格式,所以我们引入一个fastjson依赖包。
在远程仓库中搜索(中央仓库没搜到,也可能是我不会搜):https://mvnrepository.com/search?q=fastjson
使用这个阿里巴巴提供的fastjson。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
问题:出现找不到依赖的错误
解决:https://blog.csdn.net/qq_44886213/article/details/123461522
2.1 添加文档
官方说明:Index API | Java REST Client [7.15] | Elastic
错误代码:
@Test
void testAddDocument() throws IOException {
//1.请求连接索引库
IndexRequest request = new IndexRequest("User");
//2.匹配规则: put /User/_doc/id,封装request
request.id("zxf");
request.timeout(TimeValue.timeValueSeconds(1)); //最长等待时间,法一
request.timeout("1s"); //法二
//3.创建文档对象
User user = new User("zxf", 36);
//4.将请求转化为json格式
request.source(JSON.toJSONString(user), XContentType.JSON);
//5.向索引中添加数据
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
//打印结果
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
问题01:Java类的全参构造函数失效
解决:@AllArgsConstructor等lombok注解不生效_玛丽莲茼蒿的博客-CSDN博客
问题02:运行单元测试时报错
解决:索引必须全是小写字母。将“User”改为"user"。
正确代码:
@Test
void testAddDocument() throws IOException {
//1.创建请求连接索引对象
IndexRequest request = new IndexRequest("user");
//2.匹配规则: put /User/_doc/id, 封装request对象
request.id("zxf");
request.timeout(TimeValue.timeValueSeconds(1)); //最长等待时间,法一
request.timeout("1s"); //法二
//3.创建文档对象
User user = new User("zxf", 36);
//4.将请求转化为json格式
request.source(JSON.toJSONString(user), XContentType.JSON);
//5.向索引中添加数据
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
//打印结果
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
便于记忆,可以如下划分逻辑
2.2 判断文档是否存在
官方说明:Exists API | Java REST Client [7.15] | Elastic
//测试 文档是否存在
@Test
void testExistDocument() throws IOException {
GetRequest getRequest = new GetRequest("user", "zxf");
//getRequest.fetchSourceContext(new FetchSourceContext(false)); // 过滤掉_source上下文的信息
//getRequest.storedFields("_none_");
boolean exists = client.exists(getRequest,RequestOptions.DEFAULT);
System.out.println(exists);
}
2.3 获取文档信息
官方说明:Get API | Java REST Client [7.15] | Elastic
//测试 获取文档信息
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("user", "zxf");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse); //返回的信息内容和kibana中一致
System.out.println(getResponse.getSource()); //只返回source字段,以Map格式返回
System.out.println(getResponse.getSourceAsString()); //只返回source字段,以字符串格式返回
}
2.4 更新文档
官方说明:Update API | Java REST Client [7.15] | Elastic
更新文档和添加文档的思路、步骤差不多,学会了添加文档,可以自己尝试写更新文档。
@Test
void testUpdateDocument() throws IOException {
// 创建请求对象,封装对象
UpdateRequest updateRequest = new UpdateRequest("user", "zxf");
updateRequest.timeout("1s");
// 创建文档对象,转为json格式放入updateRequest里
User user = new User("zxf", 37);
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
//client发起请求,返回响应对象
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}
再去head里检查一下,更新成功。
这里需要记住的一点是,用到了doc()方法,和我们kibana使用更新命令是一致的。
2.5 删除文档
官方说明:Delete API | Java REST Client [7.15] | Elastic
上面学习了那么多,这个也可以尝试自己去写了。
//测试 删除文档
@Test
void testDeleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("user", "zxf");
//deleteRequest.timeout("1s"); //超过1秒就不执行了
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
再去head看一下,删除成功
2.6 批量添加文档
前面讲得都是添加、更新、删除单个文档,但是在真实项目中都是批量处理的。所以官方给出了批量处理的API:Bulk API | Java REST Client [7.15] | Elastic
代码:还是分3步走
//测试 批量添加文档
@Test
void testBulkDocument() throws IOException {
//1. 创建请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s"); //根据需求(感觉)设置
//2.创建文档对象列表
ArrayList<User> userArrayList = new ArrayList<>();
userArrayList.add(new User("zxf1", 11)) ;
userArrayList.add(new User("zxf2", 12)) ;
userArrayList.add(new User("zxf3", 13)) ;
userArrayList.add(new User("zxf4", 14)) ;
userArrayList.add(new User("zxf5", 15)) ;
//批处理请求
for(int i=0;i<userArrayList.size();i++){
bulkRequest.add(
new IndexRequest("user") //3种选择:添加文档、更新文档、删除文档
.id(""+(i+1)) //不定义id的话会自动生成随机数作为id
.source(JSON.toJSONString(userArrayList.get(i)),XContentType.JSON)
);
}
//3.client发起批量请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //输出是否失败,false为成功
}
再去head看一下
注意01:如果想要改为批量删除、批量更新操作,只需要改动这里:
注意02:如果去掉对id的设置,运行,查看一下结果
生成随机数作为id
2.7 批量删除文档
为了后面的测试,我们先删掉这些id为随机数的文档。
//测试 批量删除
@Test
void testBulkDeleteDocument() throws IOException {
//1. 创建批量请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
//2.批处理请求
bulkRequest.add(
new DeleteRequest("user","FOJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","FeJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","FuJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","F-J4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","GOJ4i38BZC1sB52QAx4r")
);
//client发起批处理请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
去head中看一下。
2.8 批量更新文档
//测试 批量更新文档
@Test
void testBulkUpdateDocument() throws IOException {
//1. 创建请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s"); //根据需求(感觉)设置
//2.创建文档对象列表
ArrayList<User> userArrayList = new ArrayList<>();
userArrayList.add(new User("ff1", 101)) ;
userArrayList.add(new User("ff2", 102)) ;
userArrayList.add(new User("ff3", 103)) ;
userArrayList.add(new User("ff4", 104)) ;
userArrayList.add(new User("ff5", 105)) ;
//批处理请求
for (int i=0;i<userArrayList.size();i++){
bulkRequest.add(
new UpdateRequest("user","") //id空着就行,但是不能不写
.id(""+(i+1))
.doc(JSON.toJSONString(userArrayList.get(i)),XContentType.JSON)
);
}
//3.client发起批量请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //输出是否失败,false为成功
}
2.9 批量删除文档(二)
前面的批量删除没有用循环,如果id是连续或者有规律的,那么可以用循环。
//测试 批量删除文档(二) 循环
@Test
void testBulkDeleteDocument2() throws IOException {
//1. 创建批量请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
//2.批处理请求
for(int i=0;i<5;i++){
bulkRequest.add(
new DeleteRequest("user","") //id空着就行,但是不能不写
.id(""+(i+1))
);
}
//client发起批处理请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
2.10 查询
这次查询之间建立的名为"test1"的索引。基本上还是可以认为分3步走。
//测试 搜索
@Test
void testSearch() throws IOException {
//1.创建搜索请求对象、创建构造器对象
SearchRequest searchRequest = new SearchRequest("test1");
//2.封装这两个对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //搜索条件构造器
//QueryBuilders.termQuery 精确匹配
//QueryBuilders.matchAllQuery() 匹配所有
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "morning");
//MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(termQueryBuilder);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.from(0); //分页
searchSourceBuilder.size(3); //分页
searchRequest.source(searchSourceBuilder);
//3.client发起搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()) );
}
运行。
注意01:可以和之前的学习比较着来记忆。
Elastic stack 技术栈学习(七)—— kibana中索引的基本操作(创建、删除、更新、查看)以及文档的基本操作_玛丽莲茼蒿的博客-CSDN博客
三、附上完整代码
package com.example.springesapi;
import com.alibaba.fastjson.JSON;
import com.example.springesapi.pojo.User;
import org.apache.lucene.util.QueryBuilder;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.ml.EvaluateDataFrameRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class SpringEsApiApplicationTests {
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client; //加上@@Qualifier,就可以用client去替换restHighLevelClient
// client就相当于kibana
@Test
void contextLoads() {
}
//测试 创建索引 Request
@Test
void testCreateIndex() throws IOException {
//1.定义 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("user");
//2.client发送请求,获得响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
//测试 获取索引 Request
@Test
void testGetIndex() throws IOException {
//1.定义 获取索引请求
GetIndexRequest request = new GetIndexRequest("test2");
//2.client发送请求,返回布尔值
boolean exists = client.indices().exists(request,RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试 删除索引
@Test
void testDeleteIndex() throws IOException {
//1.定义 删除索引请求
DeleteIndexRequest request = new DeleteIndexRequest("User");
//2.client发送请求,获得响应
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged()); //响应的状态为true就代表成功删除
}
//测试 添加文档
@Test
void testAddDocument() throws IOException {
//1.创建请求连接索引对象
IndexRequest request = new IndexRequest("user");
//2.匹配规则: put /User/_doc/id, 封装request对象
request.id("zxf");
request.timeout(TimeValue.timeValueSeconds(1)); //最长等待时间,法一
request.timeout("1s"); //法二
//3.创建文档对象
User user = new User("zxf", 36);
//4.将请求转化为json格式
request.source(JSON.toJSONString(user), XContentType.JSON);
//5.向索引中添加数据
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
//打印结果
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
//测试 文档是否存在
@Test
void testExistDocument() throws IOException {
GetRequest getRequest = new GetRequest("user", "zxf");
//getRequest.fetchSourceContext(new FetchSourceContext(false)); // 过滤掉_source上下文的信息
//getRequest.storedFields("_none_");
boolean exists = client.exists(getRequest,RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试 获取文档信息
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("user", "zxf");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse); //返回的信息内容和kibana中一致
System.out.println(getResponse.getSource()); //只返回source字段,以Map格式返回
System.out.println(getResponse.getSourceAsString()); //只返回source字段,以字符串格式返回
}
//测试 更新文档
@Test
void testUpdateDocument() throws IOException {
// 创建更新请求对象,封装对象
UpdateRequest updateRequest = new UpdateRequest("user", "zxf");
updateRequest.timeout("1s");
// 创建文档对象,转为json格式封装更新请求对象
User user = new User("zxf", 37);
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
//client发起请求,返回响应对象
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}
//测试 删除文档
@Test
void testDeleteDocument() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("user", "zxf");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
//测试 批量添加文档
@Test
void testBulkAddDocument() throws IOException {
//1. 创建请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s"); //根据需求(感觉)设置
//2.创建文档对象列表
ArrayList<User> userArrayList = new ArrayList<>();
userArrayList.add(new User("zxf1", 11)) ;
userArrayList.add(new User("zxf2", 12)) ;
userArrayList.add(new User("zxf3", 13)) ;
userArrayList.add(new User("zxf4", 14)) ;
userArrayList.add(new User("zxf5", 15)) ;
//批处理请求
for (int i=0;i<userArrayList.size();i++){
bulkRequest.add(
new DeleteRequest("user")
);
}
//3.client发起批量请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //输出是否失败,false为成功
}
//测试 批量删除文档(一) 无循环
@Test
void testBulkDeleteDocument() throws IOException {
//1. 创建批量请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
//2.批处理请求
bulkRequest.add(
new DeleteRequest("user","FOJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","FeJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","FuJ4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","F-J4i38BZC1sB52QAx4r")
);
bulkRequest.add(
new DeleteRequest("user","GOJ4i38BZC1sB52QAx4r")
);
//client发起批处理请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
//测试 批量更新文档
@Test
void testBulkUpdateDocument() throws IOException {
//1. 创建请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s"); //根据需求(感觉)设置
//2.创建文档对象列表
ArrayList<User> userArrayList = new ArrayList<>();
userArrayList.add(new User("ff1", 101)) ;
userArrayList.add(new User("ff2", 102)) ;
userArrayList.add(new User("ff3", 103)) ;
userArrayList.add(new User("ff4", 104)) ;
userArrayList.add(new User("ff5", 105)) ;
//批处理请求
for (int i=0;i<userArrayList.size();i++){
bulkRequest.add(
new UpdateRequest("user","") //id空着就行,但是不能不写
.id(""+(i+1))
.doc(JSON.toJSONString(userArrayList.get(i)),XContentType.JSON)
);
}
//3.client发起批量请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //输出是否失败,false为成功
}
//测试 批量删除文档(二) 循环
@Test
void testBulkDeleteDocument2() throws IOException {
//1. 创建批量请求对象,封装对象
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
//2.批处理请求
for(int i=0;i<5;i++){
bulkRequest.add(
new DeleteRequest("user","") //id空着就行,但是不能不写
.id(""+(i+1))
);
}
//client发起批处理请求
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
}
//测试 搜索
@Test
void testSearch() throws IOException {
//1.创建搜索请求对象、创建构造器对象
SearchRequest searchRequest = new SearchRequest("test1");
//2.封装这两个对象
SearchSourceBuilder searchSourceBuildersourceBuilder = new SearchSourceBuilder(); //搜索条件构造器
//QueryBuilders.termQuery 精确匹配
//QueryBuilders.matchAllQuery() 匹配所有
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "morning");
//MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuildersourceBuilder.query(termQueryBuilder);
searchSourceBuildersourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuildersourceBuilder.from(0); //分页
searchSourceBuildersourceBuilder.size(3); //分页
searchRequest.source(searchSourceBuildersourceBuilder);
//3.client发起搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()) );
}
}