Elasticsearch分頁主要有三種方式,分別是普通的from+size分頁、scroll api滾動分頁、search_after分頁,下面依次介紹這三種分頁
from+size分頁
- 查詢腳本
GET /run-store/store/_search
{
"query": {
"match_all": {}
},
"size": 1,
"from": 0,
"sort": {
"_id": {
"order": "desc"
}
}
}
- 分頁說明
- 比如說,我們要查詢第10頁數據,這時from=90, size=10, 每個shard返回自己的前100條數據給協調節點,協調節點進行合併、排車、分頁等,得到第10頁的數據,返回給客戶端
- 從上面大致流程可以看出,因爲es是分佈式的,數據分散在各個shard,所以必須每個shard都要查詢自己的前100條,合併後才能知道第10頁的數據
- 所以,當分頁越深,每個shard需要查詢的數據就越大,性能就會越低,基本上到幾十頁之後,查詢都要5-10秒左右了,而且協調節點合併、排序、分頁都是在內存中進行的,數據量越來越大,容易造成內存不足
- 默認情況下,es支持最大條數爲10000,超過10000就會出錯(也就是1000頁左右),不過可以通過修改配置調大
scroll api分頁
- 第一頁查詢腳本
GET /run-store/store/_search?scroll=5m
{
"query": {
"match_all": {}
},
"size": 1,
"from": 0,
"sort": {
"_id": {
"order": "desc"
}
}
}
- 第一頁查詢結果
{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAGHn7FjRXNkZmY3ZmVGJPVXJ1NWs2MUh5RGcAAAAAABh5_BY0VzZGZmN2ZlRiT1VydTVrNjFIeURnAAAAAAAYef8WNFc2RmZjdmZUYk9VcnU1azYxSHlEZwAAAAAAGHn9FjRXNkZmY3ZmVGJPVXJ1NWs2MUh5RGcAAAAAABh5_hY0VzZGZmN2ZlRiT1VydTVrNjFIeURn",
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 15,
"max_score": null,
"hits": [
{
"_index": "run-store",
"_type": "store",
"_id": "9012",
"_score": null,
"_source": {
"storeCode": "9012",
"storeName": "經年1"
},
"sort": [
"9012"
]
}
]
}
}
- 第二頁查詢(第三、第四等等頁查詢腳本與第二頁相同)
GET /_search/scroll?scroll=5m
{
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAGHoQFjRXNkZmY3ZmVGJPVXJ1NWs2MUh5RGcAAAAAABh6DxY0VzZGZmN2ZlRiT1VydTVrNjFIeURnAAAAAAAYehIWNFc2RmZjdmZUYk9VcnU1azYxSHlEZwAAAAAAGHoRFjRXNkZmY3ZmVGJPVXJ1NWs2MUh5RGcAAAAAABh6ExY0VzZGZmN2ZlRiT1VydTVrNjFIeURn"
}
- 分頁說明
- 首次查詢,生成一個包含所有數據的快照,每次需要傳入sroll_id,依次往下分頁
- 不支持跳頁查詢
- 新數據不會被查詢出來
- 快照有有效期
search_after分頁(推薦使用)
- 第一頁查詢腳本
GET /run-store/store/_search
{
"query": {
"match_all": {}
},
"size": 1,
"from": 0,
"sort": {
"_id": {
"order": "desc"
}
}
}
- 第二頁查詢腳本(第三、第四等等頁查詢腳本與第二頁類似,只是
search_after
中的值取上一頁最後一條記錄對應的_id
)
GET /run-store/store/_search
{
"query": {
"match_all": {}
},
"size": 1,
"from": 0,
"search_after": [
"2019080510000346"
],
"sort": {
"_id": {
"order": "desc"
}
}
}
- 分頁說明
- 第一頁與普通分頁一致,第二頁開始需要添加
search_after
參數,裏面值取上一頁最後一條記錄的_id
- 不支持跳頁查詢
- 新增的記錄會包含進來
- 這種分頁效果會更好,推薦使用
- 第一頁與普通分頁一致,第二頁開始需要添加