Elasticsearch Java客户端选型咨询:废弃高級REST客户端VS新版Java Client API
Elasticsearch Java客户端对比与Delete By Query实现指南
一、Java Rest Client 和 Java Client API 的核心区别
- 定位差异:
- Java Rest Client(低级REST客户端):是纯粹的HTTP工具,完全对应ES的REST接口,不绑定ES核心库,灵活性拉满,但所有请求细节都得手动处理——比如拼接URL、构造JSON请求体、解析响应,代码会比较繁琐。
- Java Client API(8.x+新客户端):官方主推的下一代专属工具,既有面向对象的便捷API,又兼容原始JSON格式,专门为ES设计,目标是替换已废弃的高级客户端,兼顾易用性和灵活性。
- API使用风格:
- 低级REST Client:全手动HTTP操作,比如调用Delete By Query时,得自己拼
http://your-es-host:9200/your_index/_delete_by_query的URL,再把查询JSON塞进请求体,适合需要完全掌控HTTP细节的场景。 - Java Client API:提供流畅的代码DSL,不用自己拼URL,同时支持直接传入原始JSON,两种写法都能搞定。
- 低级REST Client:全手动HTTP操作,比如调用Delete By Query时,得自己拼
- 维护状态:
- 低级REST Client:官方仍在维护,但属于基础工具层,不会新增ES特定的高级功能。
- Java Client API:官方重点迭代的方向,后续所有新特性都会优先落地在这里,是长期适配的首选。
二、该选哪一个?
- 若你需要极致灵活性,比如自定义请求头、处理复杂跨集群逻辑,或者项目仍在使用ES 7.17之前的旧版本,可以选低级REST Client。
- 若你用的是ES 8.x+,直接选Java Client API:它既能用简洁的代码构建查询,又支持你需要的原始JSON格式,而且是官方长期支持的方向,后续升级不会踩兼容性坑。
三、Java Client API 怎么实现 Delete By Query?
你觉得新客户端没这个功能是没找对入口,它已经集成在deleteByQuery方法里了,给你两种写法,包括你要的原始JSON方式:
1. 用DSL代码构建查询
import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse; import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; // 注入Spring管理的ElasticsearchClient实例 @Autowired private ElasticsearchClient esClient; public void deleteByQueryWithDsl() throws IOException { DeleteByQueryResponse response = esClient.deleteByQuery(req -> req .index("你的索引名") // 指定要操作的索引 .query(q -> q .match(m -> m .field("要匹配的字段名") .query("匹配值") // 这里写你的查询条件 ) ) ); // 打印删除的文档数量 System.out.println("成功删除" + response.deleted() + "条文档"); }
2. 直接用原始JSON请求体
如果你习惯写原生JSON,直接把查询JSON传进去即可:
import java.io.StringReader; import java.io.IOException; public void deleteByQueryWithRawJson() throws IOException { // 你的原始查询JSON String rawQueryJson = """ { "query": { "match": { "要匹配的字段名": "匹配值" } } } """; DeleteByQueryResponse response = esClient.deleteByQuery(req -> req .index("你的索引名") .withJson(new StringReader(rawQueryJson)) // 传入原始JSON ); System.out.println("成功删除" + response.deleted() + "条文档"); }
要是偶尔需要更底层的HTTP控制,也可以通过esClient._transport().restClient()拿到低级REST客户端发送请求,但一般场景下上面两种写法完全够用。
内容的提问来源于stack exchange,提问作者Saverio Mirko Viola
相关产品推荐
相关产品推荐

