2015-03-31 55 views
1

删除我的elasticsearch 1.4我用来删除使用DeleteByQuery API类似这样的文件:Elasticsearch 1.5袅袅不queryapi

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 APIdocumentation Java API对我来说似乎不完整(缺少删除示例)

PS:我正在寻找理解与Java或卷曲(无论对于我最终我需要两者)。

+0

Tr的要搜索“批量API”,你可以找到这个例子。目前我正在学习elasticsearch,所以我不太确定这是否是解决方案。但在该页面中,有一些代码正在删除。 – WindMemory 2015-03-31 14:29:20

回答

2

我遇到了这个问题,以及无法找到一个很好的代码示例。我会告诉你我想出了什么。我不确定这是否是最好的方式,所以请随时评论一下如何改进。请注意,我将查询结果的大小设置为Integer.MAX_VALUE,以便查询将返回需要删除的结果的全部(或尽可能多)结果。

  1. 运行查询来获取所有的ID将被删除
  2. 添加删除所有的ID请求到一个批量请求
  3. 运行批量请求
  4. 重新运行查询,看看是否有更多的记录需要删除
  5. 如有必要,重复

    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(); 
        } 
    } 
    
+0

谢谢,这看起来很完美!我改变了公司,现在不用ES工作,但我会尽快尝试验证您的答案。 – Guinoutortue 2015-08-10 15:01:11