【问题标题】:Elasticsearch java API bulk delete not workingElasticsearch java API批量删除不起作用
【发布时间】:2015-09-04 08:01:36
【问题描述】:

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

}

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

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

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

    正确的做法是使用专门的scan and scroll search 对记录进行分页。这种类型的搜索将使结果在调用之间保持一致。可以在 v2.0 中提供的 delete by query 插件中找到这种方法的一个示例。

    我还需要注意,虽然 delete by query 功能存在于早期版本的 elasticsearch 中,并且它似乎是解决您的问题的最简单方法,但我仍然建议使用扫描/滚动,因为 poor performance and fragility v2.0 之前的现有通过查询 API 实现删除。

    【讨论】:

      【解决方案2】:

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

      你需要使用类似这样的东西来定义分页

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-18
        • 2013-07-08
        • 2017-05-24
        • 2016-05-07
        • 2020-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多