ES 高级客户端(RestHighLevelClient)入门
1. 一句话简介
Elasticsearch Rest High Level Client 是 Elastic 官方提供的 Java 高级 REST 客户端,基于 HTTP 协议与 Elasticsearch 集群通信,为索引、文档、搜索等操作提供强类型、面向对象的 API。它封装了底层 RestClient(低级客户端)的 JSON 拼接细节,让开发者用 IndexRequest、SearchRequest、UpdateRequest 等请求对象即可完成增删改查,是 ES 7.x 时代官方推荐的 Java 接入方式。
本 demo 模块(demo-elasticsearch-rest-high-level-client)演示了如何在 Spring Boot 中手动装配该客户端:通过 @ConfigurationProperties 绑定集群地址、超时、连接池等配置,用 @Bean 注册 RestHighLevelClient,并封装出创建/删除索引、插入/更新/删除/查询文档的完整 CRUD 能力(对应 BaseElasticsearchService 与 PersonServiceImpl)。
2. 什么时候使用
✅ 适用场景
- 需要强类型、可读性好的 ES 操作代码:相比低级客户端手写 JSON,
IndexRequest、SearchSourceBuilder等对象化 API 更易读、易维护,编译期即可发现拼写错误。 - 需要精细控制连接与集群行为:可通过
RestClientBuilder的回调设置连接超时、Socket 超时、连接池上限(maxConnectTotal/maxConnectPerRoute),并支持配置多个集群节点实现负载均衡与故障转移。 - 需要覆盖索引管理 + 文档 CRUD + 查询的完整能力:本 demo 即演示了从建索引(可配分片/副本数)到增删改查文档的完整链路,适合作为业务接入 ES 的基础封装。
- 需要支持 ES 安全认证:客户端内置
CredentialsProvider,可配置用户名密码(X-Pack Security),满足带认证的集群接入。 - 需要与 Spring Boot 深度集成:客户端作为普通 Bean 注入,配合
@ConfigurationProperties实现配置外部化,符合 Spring 生态的开发习惯。
❌ 不适用/需谨慎
- 追求极致的底层控制或自定义协议细节:高级客户端隐藏了底层 HTTP 细节,若需要直接操作原始响应、自定义序列化或精细控制请求头,低级客户端(RestClient)更合适。
- 需要对象与文档自动映射、声明式仓储:高级客户端不提供类似 Spring Data 的
Repository抽象,实体与文档的转换(如本 demo 用 HutoolBeanUtil手动转换)需自行实现。 - 版本兼容性敏感的场景:客户端版本必须与 ES 服务端版本保持兼容(本 demo 固定为 7.3.0),跨大版本升级(如 7.x 到 8.x)时 API 有较大变动,需谨慎评估。
- ES 7.x 之前的旧集群:TransportClient 在 7.x 已废弃,若仍维护 6.x 及以下集群,需评估升级成本或改用兼容方案。
- 超大规模、超高吞吐的写入场景:高级客户端本身不提供批量写入的自动分片/重试策略,大批量写入需自行结合 Bulk API 与连接池调优。
3. 常见业务场景
全文检索与站内搜索:对商品、文章、日志等文本数据建立索引,利用 ES 的倒排索引实现毫秒级全文检索。本 demo 的 searchList 通过 SearchSourceBuilder + QueryBuilders 构建查询,可在此基础上扩展 match、term、range 等复杂查询,适合电商、内容平台等搜索需求。
索引生命周期管理:业务中常需按时间或业务维度动态创建/删除索引(如按月分索引的日志库)。本 demo 的 createIndexRequest/deleteIndexRequest 演示了通过 CreateIndexRequest 配置分片与副本数、按需删除索引的能力,可直接复用于索引的自动化管理。
文档级 CRUD 的数据同步:将关系型数据库或业务系统的数据同步到 ES 作为查询副本。本 demo 的 insert/update/delete 分别对应 IndexRequest、UpdateRequest、DeleteRequest,覆盖了文档的增、改、删,适合构建数据同步管道或缓存层。
带认证的集群接入:当 ES 集群开启 X-Pack Security 时,客户端通过 CredentialsProvider 配置用户名密码完成认证。本 demo 的 ElasticsearchAutoConfiguration 已预留 Account 配置,适合需要安全访问的生产环境。
连接池与超时调优的稳定接入:对高并发访问场景,通过 setRequestConfigCallback 与 setHttpClientConfigCallback 精细配置连接超时、Socket 超时与连接池上限,避免连接耗尽或请求长时间阻塞。本 demo 的自动配置类完整演示了这套调优入口。
4. 同类技术对比
| 技术 | 通信协议 | 易用性 | 版本耦合 | 学习成本 | 适用规模/场景 |
|---|---|---|---|---|---|
| Rest High Level Client | HTTP (9200) | 高,强类型对象化 API | 需与 ES 版本匹配 | 中 | 中小型到大型,官方推荐,功能全面 |
| Rest Low Level Client | HTTP (9200) | 低,需手写 JSON | 低,协议稳定 | 中 | 需要底层控制、自定义请求的场景 |
| Spring Data Elasticsearch | HTTP (9200) | 高,声明式 Repository | 高,版本耦合严重、支持滞后 | 低 | 快速 CRUD、与 Spring Data 生态统一 |
| TransportClient(已废弃) | TCP (9300) | 中 | 极高,7.x 已移除 | 中 | 仅存量 6.x 及以下项目,新项目禁用 |
选型建议:新项目接入 ES 7.x 且需要完整、可控的索引与查询能力时,优先选 Rest High Level Client——它兼顾了易用性与灵活性,是官方推荐的主流方案。若团队已深度使用 Spring Data 生态、需求以简单 CRUD 为主且能接受版本升级滞后,可选 Spring Data Elasticsearch 以换取更低的开发成本。需要精细控制底层 HTTP 行为或自定义序列化时,退而使用 Rest Low Level Client。TransportClient 已废弃,任何新项目都不应选用,存量项目应尽快迁移到 HTTP 客户端。