现在,
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的类,它提供了获取信息或取消任务的能力,但不提供提交新任务的能力。
这是我的问题:
deleteByQuery
中使用 ElasticsearchAsyncClient
相当于提交任务吗?我有点困惑,但我解决了问题。 当使用
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;
}
“任务”这个词消失到哪里去了? 我花了很长时间才找到它,谢谢。