繁体   English   中英

Elasticsearch Java API批量删除不起作用

[英]Elasticsearch java API bulk delete not working

我正在尝试对ID源自先前搜索的文档进行批量删除。 确定要删除的文档的查询产生了预期的结果(成千上万条记录),但是批量删除一次只删除10条记录,即使我将原始查询的所有结果都输入了该记录也是如此;

Client client = node.client();
BulkRequestBuilder bulkRequest = client.prepareBulk();

SearchResponse deletes = client.prepareSearch("my_index")
        .setTypes("my_doc_type")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(boolQuery().mustNot(termQuery("tId", transactionId)))
        .execute()
        .actionGet();

long deleteHits = deletes.getHits().getTotalHits();

if (deleteHits > 0) {

    logger.info("Preparing to delete (" + deleteHits + ") " +
            "documents from index");

    Arrays.asList(deletes.getHits().getHits()).stream().forEach(h ->
            bulkRequest.add(client.prepareDelete()
                .setIndex("my_index")
                .setType("my_doc_type")
                .setId(h.getId())));
    }

    BulkResponse bulkResponse = bulkRequest.execute().actionGet();

    if (bulkResponse.hasFailures()) {
        throw new RuntimeException(bulkResponse.buildFailureMessage());
    }

}

默认情况下,搜索响应仅返回前10个结果。 因此,尽管deletes .getHits().getTotalHits()可以是数千甚至上百万,但deletes.getHits().getHits()size永远不会超过请求的size参数中指定的size ,即10默认。

天真的方法是尝试通过更改from参数使用普通搜索对结果进行分页抛出。 但是,由于每个命令将执行一个新的搜索,并且由于删除前一个搜索中的记录而导致下一个搜索的结果与前一个搜索相比发生偏移,因此这可能会导致丢失某些记录。

一种适当的方法是使用专门的扫描和滚动搜索来分页抛出记录。 这种类型的搜索将使调用之间的结果保持一致。 这种方法的一个示例可以在v2.0中可用的按查询删除插件中找到。

我还需要注意的是,尽管ElasticSearch的早期版本中存在按查询删除功能,并且这似乎是解决您问题的最简单的解决方案,但由于现有删除的性能和脆弱性 ,我仍建议使用扫描/滚动在v2.0之前的版本中通过查询API实现。

deletes.getHits().getTotalHits为您提供搜索的总点击数,但SearchResponse deletes并不包含所有结果。 您需要对其进行分页。

您将需要使用类似这样的内容来定义分页

client.prepareSearch("my_index").setFrom(int from).setSize(int pageSize);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM