elastic java delete_Elasticsearch 2.0以上版本根据条件批量删除Java如何实现

在Elasticsearch 2.0及更高版本中,由于`Delete by Query`被移除以防止内存溢出,因此需要采用新的方法进行条件批量删除。可以先使用Search API查询匹配条件的数据,获取id,然后通过id进行删除。具体实现是先创建`BulkRequestBuilder`,执行搜索请求获取`SearchHit`,再将删除请求添加到批量请求中,最后执行批量删除操作并检查响应以处理失败的项。
摘要由CSDN通过智能技术生成

Elasticsearch在2.0以前版本,删除操作有两种方式,一种是通过id来进行删除,但是这种方式一般不常用,因为id不容易得到;另一种方式是通过先查询操作,然后删除,也就是通过client.prepareDeleteByQuery这种方式来根据条件批量删除数据:

DeleteByQueryResponse response = client.prepareDeleteByQuery("library")

.setQuery(QueryBuilders.termQuery("title", "ElasticSearch"))

.execute().actionGet();

但是Delete by Query在2.0版本及其以上的版本已经被移除了,因为这种方式会自动强制刷新,所以在大量索引并发的情况下,会很快造成内存溢出。

那么在2.0以后的版本,我们如何来进行批量的删除呢?

我们可以先通过Search API查询,然后得到需要删除的批量数据的id,然后再通过id来删除。

具体实现代码:

public void deleteByTerm(Client client){

BulkRequestBuilder bulkRequest = client.prepareBulk();

SearchResponse response = client.prepareSearch("megacorp").setTypes("employee")

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(QueryBuilders.termQuery("first_name", "xiaoming"))

.setFrom(0).setSize(20).setExplain(true).execute().actionGet();

for(SearchHit hit : response.getHits()){

String id = hit.getId();

bulkRequest.add(client.prepareDelete("megacorp", "employee", id).request());

}

BulkResponse bulkResponse = bulkRequest.get();

if (bulkResponse.hasFailures()) {

for(BulkItemResponse item : bulkResponse.getItems()){

System.out.println(item.getFailureMessage());

}

}else {

System.out.println("delete ok");

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值