Search Scroll API

    为了使用滚动,需要按照给定的顺序执行以下步骤。

    检索所有相关文档

    其次, 接收到的滚动标识符必须被设置到下一个新的滚动间隔的 SearchScrollRequest, 并通过 searchScroll 方法发送。Elasticsearch会使用新的滚动标识符返回另一批结果。 然后可以在随后的SearchScrollRequest中使用此新的滚动标识符来检索下一批结果,等等。应该循环重复此过程,直到不再返回结果,这意味着滚动已经用尽,并且已经检索到所有匹配的文档。

    1. scrollRequest.scroll(TimeValue.timeValueSeconds(30));
    2. SearchResponse searchScrollResponse = client.searchScroll(scrollRequest);
    3. scrollId = searchScrollResponse.getScrollId(); // Read the new scroll id, which points to the search context that’s being kept alive and will be needed in the following search scroll call
    4. assertEquals(3, hits.getTotalHits());
    5. assertEquals(1, hits.getHits().length);
    6. assertNotNull(scrollId);

    可选参数

    构建 SearchScrollRequest 是可以选择使用以下参数:

    1. SearchResponse searchResponse = client.searchScroll(scrollRequest);

    异步执行

    下面是一个滚动搜索的完整示例:

    1. final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
    2. searchRequest.scroll(scroll);
    3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    4. searchSourceBuilder.query(matchQuery("title", "Elasticsearch"));
    5. searchRequest.source(searchSourceBuilder);
    6. SearchResponse searchResponse = client.search(searchRequest); // 通过发送初始化 SearchRequest 来初始化搜索上下文
    7. String scrollId = searchResponse.getScrollId();
    8. while (searchHits != null && searchHits.length > 0) { //在一个循环中通过调用 Search Scroll api 检索所有搜索命中结果,知道没有文档返回为止。
    9. //创建一个新的SearchScrollRequest,持有最近一次返回的滚动标识符和滚动间隔
    10. scrollRequest.scroll(scroll);
    11. searchResponse = client.searchScroll(scrollRequest);
    12. scrollId = searchResponse.getScrollId();
    13. searchHits = searchResponse.getHits().getHits();
    14. //处理返回的搜索结果
    15. }
    16. ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); //一旦滚动完成,清除滚动上下文
    17. clearScrollRequest.addScrollId(scrollId);
    18. ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest);