Elasticsearch 8.3.0 Java API客户端DeleteRequest代码示例咨询
Elasticsearch 8.3.0 新版Java API客户端单条文档删除实现
以下代码全部基于官方co.elastic.clients包下的新版Java API Client编写,完全适配8.3.0版本,未使用任何已废弃的High Level Rest Client、Transport Client接口。
前置:客户端初始化
首先需要初始化新版客户端实例,无认证场景代码如下:
import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; // 初始化底层Rest客户端 RestClient restClient = RestClient.builder(new HttpHost("127.0.0.1", 9200)).build(); // 构建传输层,使用Jackson做JSON序列化 ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper()); // 初始化ES客户端 ElasticsearchClient esClient = new ElasticsearchClient(transport);
场景1:已知文档ID,使用DeleteRequest删除
原生DeleteRequest要求必须传入文档ID,适合明确知道待删除文档ID的场景:
import co.elastic.clients.elasticsearch.core.DeleteResponse; // 传入参数 String indexName = "你的业务索引名"; String targetDocId = "待删除文档的ID"; DeleteResponse response = esClient.delete(req -> req .index(indexName) .id(targetDocId) ); // 处理返回结果 System.out.printf("操作结果:%s,文档版本号:%d%n", response.result().jsonValue(), response.version());
场景2:仅知道匹配条件,按条件删除单条文档
如果没有文档ID,仅能通过字段匹配条件定位文档,无法直接使用DeleteRequest,需要用DeleteByQueryRequest实现,核心要加size(1)配置,限制最多删除1条匹配文档,避免条件不唯一时批量删错数据:
提示:如果条件可能命中多条文档,建议先通过相同查询条件搜索拿到目标文档ID,再用上面的按ID删除方式,准确性更高。
import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse; import co.elastic.clients.json.JsonData; // 传入参数 String indexName = "你的业务索引名"; // 示例匹配规则:title字段精确等于"待删除标题"、createTime字段小于指定时间戳 // 可根据业务替换为term、match、range等任意查询组合 DeleteByQueryResponse response = esClient.deleteByQuery(req -> req .index(indexName) .query(query -> query .bool(bool -> bool .must( m -> m.term(t -> t.field("title").value("待删除标题")), m -> m.range(r -> r.field("createTime").lt(JsonData.of(1690000000000L))) ) ) ) .size(1) // 限制最多删除1条,防止误删 ); // 处理返回结果 System.out.printf("实际删除文档数:%d%n", response.deleted());
注意事项
- 客户端使用完成后需要调用
esClient.close()释放底层连接资源,该方法会自动关闭关联的transport和restClient实例 - 如果集群开启了账号密码+HTTPS认证,初始化RestClient时需要补充凭证配置:
import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.impl.client.BasicCredentialsProvider; BasicCredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("你的ES账号", "你的ES密码")); RestClient restClient = RestClient.builder(new HttpHost("127.0.0.1", 9200, "https")) .setHttpClientConfigCallback(builder -> builder .setDefaultCredentialsProvider(credsProvider) // 自签证书场景可配置自定义SSL上下文,生产环境建议使用正规证书 ) .build();
- 删除操作属于不可逆写操作,生产环境执行前建议先做查询校验,确认匹配的文档符合预期。
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

