如何将 Scroll API 与 ReactiveElasticsearchClient 一起使用

How to use the Scroll API with the ReactiveElasticsearchClient

我是响应式编程的新手,我正在尝试切换到 ReactiveElasticsearchClient

现在旧代码使用 RestHighLevelClient 并使用 do-while 循环进行滚动搜索,如下所示:

SearchRequest searchRequest = searchRequest(indexName)
        .source(searchSource()
                        .query(QueryBuilders.matchAllQuery())
                        .fetchSource(true)
                        .sort("id", SortOrder.ASC)
                        .size(1000))
        .scroll(TimeValue.timeValueSeconds(60L));

SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
String scrollId = searchResponse.getScrollId();

do {
    /*
    * work with the search hits and
    * and do some logic here
    *
    * */

    SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId).scroll(TimeValue.timeValueSeconds(60));

    try {
        searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
        searchHits = searchResponse.getHits();
        scrollId = searchResponse.getScrollId();

    } catch (Exception e) {

        LOGGER.error(e.getMessage());
    }

} while (searchHits.getHits().length > 0);

ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);

如何使用 ReactiveElasticsearchClient 在反应管道中执行相同的操作? RestHighLevelClient 使用的某些 类 不适用于反应式客户端。

使用

Flux<SearchHit> ReactiveElasticsearchClient.scroll(SearchRequest request)

此方法在后台使用滚动条 API 执行给定的查询。 ReactiveElasticsearchClient 在内部维护滚动 ID 并从 Elasticsearch 获取下一个 批次 数据,因为该方法的调用者使用返回的 Flux<SearchHit> 直到获取所有数据。

至于RestHighLevelClientReactiveElasticsearchClient使用的类:

它使用的 RestHighLevelClient 和 类 来自 Elasticsearch 库(rest-highlevel-client 和 Elasticsearch 核心)。 Spring 数据 Elasticsearch 使用 RestHighLevelClient 访问 Elasticsearch。当您直接使用 RestHighLevelClient 时,您使用的不是 Spring Data Elasticsearch,而是普通的 Elasticsearch 代码。

ReactiveElasticsearchClient 由 Spring Data Elasticsearch 提供,而不是由 Elasticsearch 提供。它也使用 类 来自 Elasticsearch 库的输入和输出,但也使用来自 Spring Data Elasticsearch 或 Spring Framework 的 类。它的目的是使用 Spring Data Elasticsearch 启用对 Elasticsearch 的反应式访问。它是 函数不是 RestHighLevelClient 的反应式副本,而是实现反应式访问所需的功能。所以你不会在 ReactiveElasticsearchClient 中为 RestHighLevelClient.

的每个函数找到对应的函数