![](/img/trans.png)
[英]Elasticsearch Delete By Query does not delete anything with RestHighLevelClient while it deletes with curl
[英]Elasticsearch 1.5 curl delete without queryapi
在我的elasticsearch 1.4上,我曾经使用DeleteByQuery API删除文档,如下所示:
curl -XDELETE http://my_elasticsearch:9200/_all/_query?q=some_field:some_value
这不是完美的(由于常规的OutOfMemoryError),但这足以满足我的需求(此时)。
但是现在我使用了新的elasticsearch 1.5,并且在文档中我已经读到:
在1.5.0中已弃用。
“按查询删除将在2.0版中删除:这是有问题的,因为它无提示地强制刷新,刷新可能会在并发索引期间迅速导致OutOfMemoryError,还会导致主数据库和副本数据库变得不一致。相反,请使用滚动/扫描API查找所有匹配的ID,然后发出批量请求将其删除。
因此,我想使用滚动/扫描API进行相同的操作。 但是如何使用这个删除呢? 我不明白 对我来说, 文档API和文档Java API似乎并不完整(缺少删除示例)。
PS:我正在寻找Java或curl的理解(无论对我而言,最终我都需要这两者)。
我也遇到了这个问题,找不到合适的代码示例。 我会告诉你我的想法。 我不确定这是否是最好的方法,所以请随时评论如何改进。 请注意,我将查询结果的大小设置为Integer.MAX_VALUE,以便查询将返回所有(或尽可能多)需要删除的结果。
必要时重复
private void deleteAllByQuery(final String index, final String type, final QueryBuilder query) { SearchResponse response = elasticSearchClient.prepareSearch(index) .setTypes(type) .setQuery(query) .setSize(Integer.MAX_VALUE) .execute().actionGet(); SearchHit[] searchHits = response.getHits().getHits(); while (searchHits.length > 0) { LOGGER.debug("Need to delete " + searchHits.length + " records"); // Create bulk request final BulkRequestBuilder bulkRequest = elasticSearchClient.prepareBulk().setRefresh(true); // Add search results to bulk request for (final SearchHit searchHit : searchHits) { final DeleteRequest deleteRequest = new DeleteRequest(index, type, searchHit.getId()); bulkRequest.add(deleteRequest); } // Run bulk request final BulkResponse bulkResponse = bulkRequest.execute().actionGet(); if (bulkResponse.hasFailures()) { LOGGER.error(bulkResponse.buildFailureMessage()); } // After deleting, we should check for more records response = elasticSearchClient.prepareSearch(index) .setTypes(type) .setQuery(query) .setSize(Integer.MAX_VALUE) .execute().actionGet(); searchHits = response.getHits().getHits(); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.