RestHighLevelClient 在 Elasticsearch 8.x + Spring Boot 3.x 中已弃用并移除,必须改用官方推荐的 elasticsearch-java 客户端;旧版仅适用于 ES ≤ 7.14,且存在兼容性、DSL 支持和依赖冲突等多重风险。

RestHighLevelClient 还能用吗?官方已弃用,但你可能还在用
不能用了——至少在 Elasticsearch 8.x + Spring Boot 3.x 场景下,RestHighLevelClient 已被 Elasticsearch 官方标记为 deprecated,且 Spring Data Elasticsearch 5.0+(对应 Spring Boot 3.2+)彻底移除了对它的依赖。如果你正在升级项目或新建服务,硬塞它进去会遇到:NoClassDefFoundError、ClassNotFoundException(比如找不到 org.elasticsearch.client.RestHighLevelClient),或者启动时因版本冲突直接失败。
- ES 7.15 起,官方主推新客户端
Elasticsearch Java API Client(即elasticsearch-java) - Spring Data Elasticsearch 4.4(SB 2.7)仍支持
RestHighLevelClient;5.0(SB 3.0+)只认elasticsearch-java - 你看到的旧教程里用
RestHighLevelClient配spring-boot-starter-data-elasticsearch,本质是“双客户端混用”,极易因elasticsearch、elasticsearch-rest-high-level-client、spring-data-elasticsearch三者版本不匹配而崩
Spring Data ES 是不是“开箱即用”?看你怎么定义“开箱”
它确实省掉手写 IndexRequest、SearchRequest 的麻烦,但“开箱即用”不等于“无脑可用”。很多团队踩坑后才发现:它默认不支持 query_string 带正则、script_score 排序、span_near 等原生 DSL 特性,也没法直接传 raw JSON query —— 因为它的 Query 抽象层做了封装,不是透传。
- 简单 CRUD 和
findByTitleContaining类方法没问题;但一写复杂聚合或自定义脚本,就得切回原生客户端,或被迫改用ElasticsearchOperations手动构造SearchRequest -
@Document(indexName = "user")注解生效的前提是:类字段名、类型、@Field配置必须和 ES mapping 严格对齐,否则写入后查不到、或字段被映射成text却想做 keyword 匹配 - Spring Boot 3.2+ 中,
spring-boot-starter-data-elasticsearch自动引入的是elasticsearch-java,底层已不是RestHighLevelClient;若你手动排除并强行引入旧 client,Spring 会拒绝启动
到底该选哪个客户端?按场景而不是按“名气”
没有银弹。你的技术选型取决于三个真实变量:ES 版本、查询复杂度、团队熟悉度。
- ES ≥ 8.0 + SB ≥ 3.0 → 必选
elasticsearch-java(即ElasticsearchClient),它是当前唯一受官方长期维护的 Java 客户端 - ES ≤ 7.14 →
RestHighLevelClient仍可用,但别再新项目里用;它不支持 8.x 的 API(如新的 security token 认证流程) - 业务以全文检索、分页列表为主,且 POJO 结构稳定 →
Spring Data Elasticsearch能显著减少样板代码 - 需要高频调用
update_by_query、reindex、ingest pipeline,或要动态拼接 DSL → 直接上elasticsearch-java,它提供JsonData.of()和完整 builder 链式调用,比RestHighLevelClient的Map构造清晰得多
最容易被忽略的兼容性雷区:依赖树里的“幽灵冲突”
很多人删了 elasticsearch-rest-high-level-client,却没发现 spring-boot-starter-data-elasticsearch 通过传递依赖偷偷拉进了 elasticsearch 核心包,而这个包的版本可能和你自己声明的 ES 服务端版本不一致 —— 比如你部署的是 ES 8.12,但依赖里混进了 elasticsearch:8.4.3,就会出现 Invalid type for a field [xxx]: expected [keyword], got [text] 这类 mapping 解析失败。
- 务必执行
mvn dependency:tree | grep elasticsearch,确认最终解析出的elasticsearch、elasticsearch-java、spring-data-elasticsearch三者坐标完全对齐 - Spring Boot 3.2+ 中,应显式声明:
<elasticsearch.version>8.12.2</elasticsearch.version>,并在spring-boot-starter-data-elasticsearch后 exclude 掉所有org.elasticsearch.*传递依赖 - 如果用
elasticsearch-java单独集成(不走 Spring Data),就不要引入spring-boot-starter-data-elasticsearch,否则两个客户端共存会导致BeanCreationException
真正卡住人的从来不是“怎么写第一个 index”,而是升级时发现旧 client 调不通、mapping 对不上、或是某条聚合语句在 Spring Data 里死活构造不出来——这些细节不会出现在文档首页,但每天都在真实日志里报错。










