【问题标题】:How to use the Scroll API with the ReactiveElasticsearchClient如何将 Scroll API 与 ReactiveElasticsearchClient 一起使用
【发布时间】:2021-11-24 19:40:52
【问题描述】:

我是响应式编程的新手,我正在尝试切换到 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 使用的某些类不适用于响应式客户端。

【问题讨论】:

    标签: elasticsearch reactive-programming project-reactor spring-data-elasticsearch


    【解决方案1】:

    使用

    Flux<SearchHit> ReactiveElasticsearchClient.scroll(SearchRequest request)
    

    此方法在底层使用滚动 API 执行给定的查询。 ReactiveElasticsearchClient 在内部维护滚动 id 并从 Elasticsearch 获取下一批 数据,因为该方法的调用者使用返回的 Flux&lt;SearchHit&gt;,直到获取所有数据。

    至于RestHighLevelClientReactiveElasticsearchClient使用的类:

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

    ReactiveElasticsearchClient 由 Spring Data Elasticsearch 提供,而不是由 Elasticsearch 提供。它也使用来自 Elasticsearch 库的输入和输出类,以及来自 Spring Data Elasticsearch 或 Spring Framework 的类。其目的是通过 Spring Data Elasticsearch 启用对 Elasticsearch 的响应式访问。它是 函数不是RestHighLevelClient 的响应式副本,而是实现响应式访问所需的。所以RestHighLevelClient的每一个函数你都不会在ReactiveElasticsearchClient中找到对应的函数。

    【讨论】:

    • 太棒了!谢谢你的澄清。
    猜你喜欢
    • 2022-12-14
    • 1970-01-01
    • 2017-07-22
    • 2015-06-24
    • 2013-07-31
    • 2018-06-29
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多