在我的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做同样的事情。但如何删除使用此?我不明白怎么做。 documentation API和documentation Java API对我来说似乎不完整(缺少删除示例)。
PS:我正在寻找对java或curl的理解(无论对于我而言,我都需要两者)。
答案 0 :(得分:2)
我也遇到了这个问题,但找不到一个好的代码示例。我会告诉你我想出了什么。我不确定这是否是最佳方式,所以请随意评论如何改进。请注意,我将查询结果的大小设置为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();
}
}