设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

和聪明人交流,和靠谱的人恋爱,和进取的人共事,和幽默的人随行。晚安!

查看: 1004|回复: 1

Springboot3整合Elasticsearch8(elasticsearch-java)最佳实践

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:203
  • 打卡月天数:0
  • 打卡总奖励:3042
  • 最近打卡:2023-08-27 07:12:49
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
384
主题
355
精华
0
金钱
4173
积分
770
注册时间
2022-12-25
最后登录
2025-8-28

发表于 2025-8-28 01:07:35 | 显示全部楼层 |阅读模式

1、Elasticsearch的JAVA客户端选择

Elasticsearch官方支持的客户端

客户端名称简介使用建议
Elasticsearch Java API Client(新客户端)官方推荐的新客户端,基于 JSON Mapping(如
  1. ElasticsearchClient
复制代码
类),从 Elasticsearch 7.15 开始推出。
✅推荐用于 Spring Boot 3+,Elasticsearch 8+
RestHighLevelClient(已废弃)基于 REST 的高级客户端,是 ES 6 ~ 7 的主力客户端,ES 8 中已标记为 deprecated。❌不推荐新项目使用
Low Level REST Client底层客户端,只提供 HTTP 封装,不解析 JSON。

🔧适合自定义协议或处理特殊 JSON 请求场景

Spring官方对Elasticsearch的封装

客户端名称简介特点
Spring Data ElasticsearchSpring 官方对 Elasticsearch 的数据访问封装,支持 Repository 风格的接口编程。👍开发效率高、和 JPA 风格一致,但功能不如原生客户端全

easy-es(dromara团队),国人之光!

客户端名称简介特点
easy-es风格类似 MyBatis-Plus,一致的 API 和分页查询方式,Java 开发者易于理解。👍开发效率高、但是是对RestHighLevelClient的深层封装,容易受版本影响,小团队维护

总结:

RestHighLevelClient 是ES7中使用最多的客户端,但是在ES8中已经废弃。

easy-es  是基于RestHighLevelClient封装的,会比较重,代码风格类似 MyBatis-Plus,熟悉MP的同学容易上手,但是容易受RestHighLevelClient和Elasticsearch版本的限制,并且目前社区虽然活跃,但项目主要靠小团队维护,不如官方客户端那样稳定长期。

Elasticsearch Java API Client 是 Elasticsearch 7.15 开始推出最新的客户端,能使用Elasticsearch中所有功能,首选首选!!!!!!

Spring Data Elasticsearch 是Spring 官方对 Elasticsearch的封装,Springboot3中已经弃用了RestHighLevelClient,选择引用了Elasticsearch Java API Client,直接解决了依赖版本冲突的问题,Spring社区强大,所以...不用我说了吧....选我!!!!!

2、Spring Data Elasticsearch 官方文档

Elasticsearch Clients :: Spring Data Elasticsearch

3、Springboot3整合Spring Data Elasticsearch

tips:我使用的是Springboot3.3.4版本

3.1 maven引入

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>
复制代码

引入成功之后可以看到:

1.jpeg

elasticsearch的新客户端elasticsearch-java也被引入了进来。

3.2 配置

yml配置文件

  1. spring:
  2. application:
  3. name: cloud-elasticsearch
  4. elasticsearch:
  5. uris: http://127.0.0.1:9200 # 这里还要注意是https还是http协议
  6. # username: elastic #如果有账号密码就要配置账号密码,否则可以不配置
  7. # password: 123456
  8. server:
  9. port: 20000
复制代码

4、【简单使用】Spring Data Elasticsearch

4.1 创建ES实体类

创建完实体类后,启动项目Spring会自动根据注解,来创建ES的索引(index)和映射(mapping)

  1. @Data
  2. @Document(indexName = "news")
  3. public class EsNews {
  4. @Id
  5. private String id;
  6. @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
  7. private String title;//标题
  8. @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
  9. private String content;//内容
  10. @Field(type = FieldType.Keyword)
  11. private String author;//作者
  12. @Field(type = FieldType.Keyword)
  13. private List<String> tags;//标签
  14. @Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
  15. @JsonProperty("publish_date")
  16. private Date publishDate;//发布时间
  17. @Field(type = FieldType.Date,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd")
  18. @JsonProperty("create_time")
  19. private Date createTime;//创建时间
  20. @Field(type = FieldType.Long)
  21. @JsonProperty("view_count")
  22. private Long viewCount;//阅读量
  23. }
复制代码

注解解析:

@Document(indexName = "news")

该实体对应的索引名称为:news

@Id

ES的唯一标识

@Field

@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_smart")

Field(字段名) , type = FieldType.Text(字段类型为TEXT) ,analyzer = "ik_max_word"(存入时的分词器为ik_max_word),searchAnalyzer = "ik_smart"(搜索时的分词器为ik_smart)

@JsonProperty("publish_date")

ES中JSON字段,迎来进行序列化映射

tips:实际开发中业务实体类和ES实体类最好是分开的,业务实体类主要用来做数据库操作,ES实体类只用来做ES检索

2.jpeg

4.2 继承ElasticsearchRepository接口

  1. public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
  2. }
复制代码

查看ElasticsearchRepository源码可以看到

ElasticsearchRepository也继承了PagingAndSortingRepository(分页和排序接口)、CrudRepository(常用基础crud接口)

3.jpeg

当你的类接口继承了ElasticsearchRepository后,你输入find,你会看到Spring帮你生成的所有常用简单的查询语句。

4.jpeg

大部分关键词用法:

关键词说明等价 Elasticsearch 查询类型
  1. findBy
复制代码
查询开始(必须)-
  1. And
复制代码
/
  1. Or
复制代码
条件连接符bool 查询
  1. Is
复制代码
/
  1. Equals
复制代码
等于term
  1. Between
复制代码
在两个值之间range
  1. LessThan
复制代码
小于range
  1. LessThanEqual
复制代码
小于等于range
  1. GreaterThan
复制代码
大于range
  1. GreaterThanEqual
复制代码
大于等于range
  1. After
复制代码
大于(时间)range
  1. Before
复制代码
小于(时间)range
  1. IsNull
复制代码
字段为 nullmust_not exists
  1. IsNotNull
复制代码
/
  1. NotNull
复制代码
字段非 nullexists
  1. Like
复制代码
类似(不建议用,Elasticsearch 中更推荐
  1. Containing
复制代码
match (部分分词匹配)
  1. NotLike
复制代码
不类似bool + must_not
  1. StartingWith
复制代码
以…开头(需要 keyword 类型字段,match 不支持)prefix / wildcard
  1. EndingWith
复制代码
以…结尾(需 keyword 类型字段)wildcard
  1. Containing
复制代码
/
  1. Contains
复制代码
包含(常用于全文检索)match
  1. NotContaining
复制代码
不包含bool + must_not
  1. In
复制代码
包含在列表中terms
  1. NotIn
复制代码
不包含在列表中bool + must_not terms
  1. True
复制代码
/
  1. False
复制代码
布尔值判断term
  1. OrderBy
复制代码
排序sort

4.3 CRUD接口使用

使用SpringBoot单元测试

4.3.1 新增

文档单个新增(save): 

  1. @Test
  2. @DisplayName("新增单个文档")
  3. void saveDoc(){
  4. EsNews news = new EsNews();
  5. news.setId("1");//如果不设置ID,Spring则会帮你生成一个ES风格的随机ID
  6. news.setTitle("电影《不能说的秘密》热映");
  7. news.setContent("内容:不能说的秘密............牛X..");
  8. news.setAuthor("周杰伦");
  9. news.setTags(Arrays.asList("电影", "国产"));
  10. news.setPublishDate(new Date());
  11. news.setCreateTime(new Date());
  12. news.setViewCount(100L);
  13. esNewsRepository.save(news);
  14. }
复制代码

文档批量新增(saveAll):

  1. @Test
  2. @DisplayName("批量新增文档")
  3. void saveBatchDoc(){
  4. List<EsNews> newsList = new ArrayList<>();
  5. for (int i = 1; i <= 11; i++) {
  6. EsNews news = new EsNews();
  7. news.setId(String.valueOf(i));
  8. news.setTitle("电影《CPW的奇幻世界 " + i + "》");
  9. news.setContent("内容 " + i);
  10. news.setAuthor("作者" + i);
  11. news.setTags(Arrays.asList("电影", "奇幻"));
  12. news.setPublishDate(new Date());
  13. news.setCreateTime(new Date());
  14. news.setViewCount(100L + i);
  15. newsList.add(news);
  16. }
  17. esNewsRepository.saveAll(newsList);
  18. }
复制代码

4.3.3 修改

!!!ElasticsearchRepository!!!的修改跟新增是同一个接口,如果你的对象携带ID,那么ES会先查询文档库里是有存在这么一个ID,如果存在的话则进行 先删除 然后 覆盖!!

  1. @Test
  2. @DisplayName("新增单个文档")
  3. void saveDoc(){
  4. EsNews news = new EsNews();
  5. news.setId("1");//ES会先找文档库里是否存在改ID,先删除再覆盖
  6. news.setTitle("电影《不能说的秘密》热映");
  7. news.setContent("内容:不能说的秘密........牛X..更新覆盖操作");
  8. news.setAuthor("周杰伦");
  9. news.setTags(Arrays.asList("电影", "国产"));
  10. news.setPublishDate(new Date());
  11. news.setCreateTime(new Date());
  12. news.setViewCount(100L);
  13. esNewsRepository.save(news);
  14. }
复制代码

如果你想做到只修改文档中其中一条数据,比如只把作者周杰伦修改成CPW,那就需要用到第五节【高阶用法】Elasticsearch Java API Client

4.3.3 查询

需求:我要查询文档编号为999的文档

tips:简单的查询,比如根据ID查询文档,ElasticsearchRepository已经自己封装好了,不用另外写。(findById)

  1. @Test
  2. @DisplayName("根据ID查询文档")
  3. void searchByID(){
  4. Optional<EsNews> news = esNewsRepository.findById("999");
  5. System.out.println(news);
  6. }
复制代码

5.jpeg

需求:我要分页查询,标题包含【奇幻世界】,作者精准是【作者1】的文档

tips:这种复杂多条件的就需要我们自己写,如果是模糊查询的则用Containing

1、EsNewsRepository新增接口findByTitleContainingOrAuthor:

  1. public interface EsNewsRepository extends ElasticsearchRepository<EsNews,String> {
  2. Page<EsNews> findByTitleContainingOrAuthor(String Title, String Author,Pageable pageable);
  3. }
复制代码

2、使用

  1. @Test
  2. @DisplayName("分页查询条件")
  3. void searchAll(){
  4. Pageable pageable = PageRequest.of(0, 10);
  5. Page<EsNews> pageList = esNewsRepository.findByTitleContainingOrAuthor("奇幻世界","作者1",pageable);
  6. for (EsNews news : pageList) {
  7. System.out.println(news);
  8. }
  9. }
复制代码

6.jpeg

根据4.2中的关键词,还有更多的用法例如过滤、排序

4.3.4 删除

删除就没什么好说的了,直接上代码!

  1. @Test
  2. @DisplayName("根据ID删除文档")
  3. void deleteDocById(){
  4. esNewsRepository.deleteById("1");
  5. System.out.println("ID为1的文档删除成功");
  6. }
  7. @Test
  8. @DisplayName("批量删除文档")
  9. void deleteBatchDoc(){
  10. esNewsRepository.deleteAll();
  11. System.out.println("文档批量删除成功");
  12. }
  13. @Test
  14. @DisplayName("根据ID批量删除文档")
  15. void deleteBatchDocByIds(){
  16. List<String> idList = Arrays.asList("1", "2");
  17. esNewsRepository.deleteAllById(idList);
  18. System.out.println("根据ID批量删除文档删除成功");
  19. }
复制代码

5、【高阶用法】Elasticsearch Java API Client

1、修改文档中的某一条数据

2、高级聚合查询

6、【最佳实践】Elasticsearch+消息队列(RabbitMQ)+数据库(MYSQL)

实际应用

到此这篇关于Springboot3整合Elasticsearch8(elasticsearch-java)最佳实践的文章就介绍到这了,更多相关Springboot3整合Elasticsearch内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:常驻代表
  • 打卡总天数:35
  • 打卡月天数:1
  • 打卡总奖励:442
  • 最近打卡:2025-12-03 02:40:07
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
503
积分
74
注册时间
2023-3-5
最后登录
2025-12-3

发表于 2025-11-18 03:48:16 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表