Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elasticsearch java API批量删除不工作_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Elasticsearch java API批量删除不工作

Elasticsearch java API批量删除不工作,java,elasticsearch,Java,elasticsearch,我正在尝试批量删除id来自上一次搜索的文档。用于确定要删除的候选文档的查询正在生成所需的结果(数千条记录),但是批量删除一次只删除10条记录,即使我正在向其提供原始查询的所有结果 Client client = node.client(); BulkRequestBuilder bulkRequest = client.prepareBulk(); SearchResponse deletes = client.prepareSearch("my_index") .setTyp

我正在尝试批量删除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());
    }

}
deletes.getHits().getTotalHits
提供搜索的总点击数,但
SearchResponse deletes
不包含所有结果。 你需要在上面翻页

您需要使用类似这样的方法来定义分页

client.prepareSearch(“我的索引”).setFrom(int-from).setSize(int-pageSize);

默认情况下,搜索响应只返回前10个结果。因此,虽然
deletes.getHits().getTotalHits()
可以是数千甚至数百万,但
deletes.getHits().getHits()
的大小永远不会超过您在请求的
size
参数中指定的值,默认值为10

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

一种适当的方法是使用专门的方法对记录进行分页。这种类型的搜索将使调用之间的结果保持一致。这种方法的一个例子可以在v2.0中提供的插件中找到

我还需要注意的是,虽然elasticsearch的早期版本中存在该功能,而且它似乎是解决您问题的最简单的解决方案,但我仍然建议使用扫描/滚动,因为v2.0之前版本中已有按查询删除API实现