Elasticsearch分頁

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
    • 不支持跳頁查詢
    • 新增的記錄會包含進來
    • 這種分頁效果會更好,推薦使用
發佈了35 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章