前端查詢,經常有分頁展示的需求,關係型數據庫中往往都提供了類似於top limit這樣的語義來支持分頁查詢。elasticsearch中也提供了from szie這兩個參數來支持分頁查詢,但是當一個索引中文檔數非常巨大的時候,通過from、size來實現分頁查詢對性能影響很大。所以,ES提供了滾動查詢API來提高查詢性能,下面介紹下Scroll API的基本用法。
首先新建一個索引,插入一些測試數據
PUT test_scroll
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
},
"mappings": {
"properties": {
"id":{
"type": "keyword"
},
"content":{
"type": "text"
}
}
}
}
然後,我們新建一個查詢,ES稱之爲初始化查詢。假設我們需要一次返回10條數據,可以新建如下查詢:
POST test_scroll/_search?scroll=1m
{
"size": 10,
"query": {
"match_all": {}
}
}
執行成功後,返回的結果裏有一個_scroll_id字段
接下來我們使用scroll api進行後續的滾動查詢,其中要指定前一次查詢返回的_scroll_id 。其中scroll參數是告訴ES要保留這個查詢上下文(可以理解爲session)多長時間,示例 1m 代表1分鐘。The search context is created by the initial request and kept alive by subsequent requests。
POST _search/scroll
{
"scroll":"1m",
"scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAucIWajJ0MFVzTy1RVWEtWXRGWjQ1RzZjZw=="
}
假設我們想手動清除這個滾動上下文(scroll search context),可以利用下面的API:
DELETE /_search/scroll
{
"scroll_id" : [
"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
]
}