在實際應用中,分頁是必不可少的,例如,前端頁面展現數據給用戶每每都是分頁進行展現的。前端
Elasticsearch分頁搜索採用的是from+size。from表示查詢結果的起始下標,size表示從起始下標開始返回文檔的個數。
示例:node
GET /test/_search?from=0&size=1 { "took" : 4, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "field1" : "value1", "field2" : "value2" } } ] } }
什麼是深分頁(deep paging)?簡單來講,就是搜索的特別深,好比總共有60000條數據,三個primary shard,每一個shard上分了20000條數據,每頁是10條數據,這個時候,你要搜索到第1000頁,實際上要拿到的是10001~10010。性能
注意這裏千萬不要理解成每一個shard都是返回10條數據。這樣理解是錯誤的!spa
下面作一下詳細的分析:
請求首先多是打到一個不包含這個index的shard的node上去,這個node就是一個協調節點coordinate node,那麼這個coordinate node就會將搜索請求轉發到index的三個shard所在的node上去。好比說咱們以前說的狀況下,要搜索60000條數據中的第1000頁,實際上每一個shard都要將內部的20000條數據中的第10001~10010條數據,拿出來,不是才10條,是10010條數據。3個shard的每一個shard都返回10010條數據給協調節點coordinate node,coordinate node會收到總共30030條數據,而後在這些數據中進行排序,根據_score相關度分數,而後取到10001~10010這10條數據,就是咱們要的第1000頁的10條數據。
以下圖所示:code
deep paging問題就是說from + size分頁太深,那麼每一個shard都要返回大量數據給coordinate node協調節點,會消耗大量的帶寬,內存,CPU。blog