如何在ElasticSearch Java API Client中提交任务?

问题描述 投票:0回答:1

现在,

RestHighLevelClient
已弃用。 所以我想在我的 Spring 项目中使用 ElasticSearch Java Api Client 重写代码。

大部分功能都在适当修改,但我还没有找到合适的方法来修改这个功能。

下面是我现有的代码。

//    import org.elasticsearch.index.reindex.DeleteByQueryRequest;
    private String deleteLarge(String indexName, Long categoryNumber, Optional<Long> age) {
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .filter(QueryBuilders.matchQuery("category", categoryNumber));
        age.ifPresent(a -> boolQueryBuilder
                .filter(QueryBuilders.matchQuery("age", a)));

        DeleteByQueryRequest request = new DeleteByQueryRequest(indexName)
                .setQuery(boolQueryBuilder)
                .setSlices(10);

        try {
            TaskSubmissionResponse taskSubmissionResponse = restHighLevelClient.submitDeleteByQueryTask(request, RequestOptions.DEFAULT);
            logger.info("DeleteByQueryTask task id: {}", taskSubmissionResponse.getTask());
            return taskSubmissionResponse.getTask();
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return null;
    }

这段代码的目的是删除非常大量的文档(从几万到几百万)。由于很难估计执行时间,所以我提交了一个任务由ES内部执行。

但是,ElasticSearch Java API Client 似乎没有这样的功能。在官方文档中,有一个类似ElasticsearchTasksClient的类,它提供了获取信息或取消任务的能力,但不提供提交新任务的能力。

这是我的问题:

  1. ES不再支持任务了吗?是否逐渐被弃用?
  2. 如果没有,还有其他方式提交新任务吗?
  3. 如果确实不可用,是否有其他方法可以实现类似的功能?在
    deleteByQuery
    中使用
    ElasticsearchAsyncClient
    相当于提交任务吗?
java elasticsearch spring-data-elasticsearch elasticsearch-java-api-client
1个回答
0
投票

我有点困惑,但我解决了问题。 当使用

deleteByQuery
时,如下所示,
DeleteByQueryResponse
返回任务 ID。 目前,很难用真正大规模的数据进行测试,因此需要进一步验证,但它的行为似乎与原始代码类似。

下面是代码修改版本的示例。


    import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
    import co.elastic.clients.elasticsearch.core.DeleteByQueryRequest;
    import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse;

    private String deleteLarge(String indexName, Long categoryNumber, Optional<Long> age) {
        BoolQuery.Builder queryBuilder = new BoolQuery.Builder().filter(
                fq -> fq.match(mq -> mq.field("categoryNumber").query(categoryNumber)));
        age.ifPresent(a -> queryBuilder.filter(
                fq -> fq.match(mq -> mq.field("age").query(a))));

        DeleteByQueryRequest newRequest = new DeleteByQueryRequest.Builder()
                .index(indexName)
                .query(queryBuilder.build()._toQuery())
                .waitForCompletion(false)
                .build();

        try {
            DeleteByQueryResponse deleteByQueryResponse = esClient.deleteByQuery(newRequest);
            logger.info("DeleteByQuery task id: {}", deleteByQueryResponse.task());
            return deleteByQueryResponse.task();

        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return null;
    }

“任务”这个词消失到哪里去了? 我花了很长时间才找到它,谢谢。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.