ElasticSearch - 分頁查詢方式二 【scroll】滾動查詢(kibana、Java示例)

BigManing發表於2020-10-20

轉載請標明出處:
http://blog.csdn.net/qq_27818541/article/details/109186734
本文出自:【BigManing的部落格】

前言

1、scroll原理

scroll API可用於從單個搜尋請求中檢索大量結果(甚至所有結果),其方式與在傳統資料庫上使用游標的方式大致相同

第一次查詢時,會生產當時查詢的快照,後續的查詢只要攜帶上次返回的scroll_id即可 。

2、特點

  1. 可以深查詢(甚至全部資料),效能、效率優於from+size方式。
  2. 快照查詢,在scroll查詢期間 ,外部對索引內的資料進行增刪改查等操作不會影響到這個快照的結果。

使用

1、kibana中測試示例

第一次查詢 ,並設定上下文scroll_id存活時間為1分鐘。

POST book/_search?scroll=1m
{
	"size": 10,
    "query": {
        "match" : {
            "name": "明朝的那些事"
        }
    }
}

響應:

{
    "_scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAD1K-0WdzM3OF9WRVFUcXk3bFNDcjZKZ1pZdw==",
    "took":22,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":1302017,
        "max_score":2.5815613,
        "hits":Array[10]
    }
}

後續查詢,使用前一個scroll_id即可:

POST _search/scroll
{
  "scroll":"1m",    
 "scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAD1K-0WdzM3OF9WRVFUcXk3bFNDcjZKZ1pZdw=="
  
}

2、Java程式碼示例

首次呼叫

// 構建搜尋條件
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
 ...
 searchSourceBuilder.from(100).size(10);
// 構建請求
SearchRequest searchRequest = new SearchRequest("book");
searchRequest.types("title");
// ===》 關鍵是多加了這句話
searchRequest.scroll(new Scroll(TimeValue.timeValueMinutes(1)));
searchRequest.source(searchSourceBuilder);
return client.search(searchRequest, RequestOptions.DEFAULT);

後續呼叫

// 傳入上次返回的scroll_id
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueMinutes(1));
SearchResponse response = client.getRestClient().scroll(scrollRequest, RequestOptions.DEFAULT);
return response;

相關文章