You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:官方仍在维护,但属于基础工具层,不会新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18