1. 程式人生 > >Elasticsearch Java API 的使用(8)—Scroll (遊標)API詳解

Elasticsearch Java API 的使用(8)—Scroll (遊標)API詳解

滾動查詢

Elasticsearch中進行大資料量查詢時,往往因為裝置、網路傳輸問題影響查詢資料的效率;Elasticsearch中提供了Scroll(遊標)的方式對資料進行少量多批次的滾動查詢,來提高查詢效率。

public class Scroll {

    public static void main(String[] args) {

        try{
            long startTime = System.currentTimeMillis();
            /*建立客戶端*/
            //client startup
            //設定叢集名稱
Settings settings = Settings.builder() .put("cluster.name", "elsearch") .put("client.transport.sniff", true) .build(); //建立client TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new
InetSocketTransportAddress( InetAddress.getByName("54.223.232.95"),9300)); List<String> result = new ArrayList<>(); String scrollId = ""; //第一次請求 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //TODO: 設定查詢條件
RangeQueryBuilder rangequerybuilder = QueryBuilders .rangeQuery("inputtime") .from("2016-12-14 02:00:00").to("2016-12-14 07:59:59"); sourceBuilder.query(QueryBuilders.boolQuery() .must(QueryBuilders .matchPhraseQuery("pointid","W3.UNIT1.10HFC01CT013")) .must(rangequerybuilder)) .size(100)//如果開啟遊標,則滾動獲取 .sort("inputtime", SortOrder.ASC); //查詢 SearchRequest request = Requests.searchRequest("pointdata"); request.scroll("2m"); request.source(sourceBuilder); SearchResponse response = client.search(request).actionGet(); //TODO:處理資料 SearchHits hits = response.getHits(); for(int i = 0; i < hits.getHits().length; i++) { //System.out.println(hits.getHits()[i].getSourceAsString()); result.add(hits.getHits()[i].getSourceAsString()); } //記錄滾動ID scrollId = response.getScrollId(); while(true){ //後續的請求 //scrollId = query.getScollId(); SearchScrollRequestBuilder searchScrollRequestBuilder = client .prepareSearchScroll(scrollId); // 重新設定滾動時間 //TimeValue timeValue = new TimeValue(30000); searchScrollRequestBuilder.setScroll("2m"); // 請求 SearchResponse response1 = searchScrollRequestBuilder.get(); //TODO:處理資料 SearchHits hits2 = response1.getHits(); if(hits2.getHits().length == 0){ break; } for(int i = 0; i < hits2.getHits().length; i++) { result.add(hits2.getHits()[i].getSourceAsString()); } //下一批處理 scrollId = response1.getScrollId(); } System.out.println(result.size()); long endTime = System.currentTimeMillis(); System.out.println("Java程式執行時間:" + (endTime - startTime) + "ms"); }catch(Exception e){ e.printStackTrace(); } }