ES中提供了 FROM/SIZE 分頁,但這種分頁有性能瓶頸。性能
Scroll會以間隔時間滾屏的方式返回所有的查詢數據,能夠做爲數據量很大的狀況下,分頁的一個替代方案ui
完整的示例以下:spa
public void scroll(){ RestHighLevelClient client = elasticClient.getRestHighLevelClient(); //初始化scroll final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L)); //設定滾動時間間隔 SearchRequest searchRequest = new SearchRequest(); searchRequest.scroll(scroll); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(matchAllQuery()); searchSourceBuilder.size(5); //設定每次返回多少條數據 searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = null; try { searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } String scrollId = searchResponse.getScrollId(); SearchHit[] searchHits = searchResponse.getHits().getHits(); System.out.println("-----首頁-----"); for (SearchHit searchHit : searchHits) { System.out.println(searchHit.getSourceAsString()); } //遍歷搜索命中的數據,直到沒有數據 while (searchHits != null && searchHits.length > 0) { SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId); scrollRequest.scroll(scroll); try { searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } scrollId = searchResponse.getScrollId(); searchHits = searchResponse.getHits().getHits(); if (searchHits != null && searchHits.length > 0) { System.out.println("-----下一頁-----"); for (SearchHit searchHit : searchHits) { System.out.println(searchHit.getSourceAsString()); } } } //清除滾屏 ClearScrollRequest clearScrollRequest = new ClearScrollRequest(); clearScrollRequest.addScrollId(scrollId);//也能夠選擇setScrollIds()將多個scrollId一塊兒使用 ClearScrollResponse clearScrollResponse = null; try { clearScrollResponse = client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } boolean succeeded = clearScrollResponse.isSucceeded(); System.out.println("succeeded:" + succeeded); }