没有queryapi的Elasticsearch 1.5卷曲删除

时间:2015-03-31 14:12:10

标签: java curl elasticsearch

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

PS:我正在寻找对java或curl的理解(无论对于我而言,我都需要两者)。

1 个答案:

答案 0 :(得分: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();
        }
    }