2025年Elastic stack技术栈学习(十)— springboot集成ES API详解

Elastic stack技术栈学习(十)— springboot集成ES API详解目录 一 关于索引的 API 详解 1 1 声明客户端 1 2 创建索引 1 3 获取文档 判断文档是否存在 1 4 删除索引 二 关于文档的 API 详解 2 1 添加文档 2 2 判断文档是否存在 2 3 获取文档信息 2 4 更新文档 2 5 删除文档 2 6 批量添加文档 2 7 批量删除文档 2 8

大家好,我是讯享网,很高兴认识大家。

目录

一、关于索引的API详解

1.1 声明客户端

1.2 创建索引

1.3 获取文档 / 判断文档是否存在 

​1.4 删除索引

二、关于文档的API详解

2.1 添加文档

2.2 判断文档是否存在

2.3 获取文档信息 

2.4 更新文档

2.5 删除文档

2.6 批量添加文档

2.7 批量删除文档

2.8  批量更新文档

2.9 批量删除文档(二)

2.10 查询

三、附上完整代码


在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/_/article/details/

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()) ); } } 

小讯
上一篇 2025-03-03 08:50
下一篇 2025-03-20 19:22

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/49762.html