elasticsearch學習筆記(二十三)——Elasticsearch 分頁搜尋以及深分頁效能問題
在實際應用中,分頁是必不可少的,例如,前端頁面展示資料給使用者往往都是分頁進行展示的。
1、ES分頁搜尋
Elasticsearch分頁搜尋採用的是from+size。from表示查詢結果的起始下標,size表示從起始下標開始返回文件的個數。
示例:
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" } } ] } }
2、深分頁效能問題
什麼將深分頁(deep paging)?簡單來說,就是搜尋的特別深,比如總共有60000條資料,三個primary shard,每個shard上分了20000條資料,每頁是10條資料,這個時候,你要搜尋到第1000頁,實際上要拿到d的是10001~10010。
注意這裡千萬不要理解成每個shard都是返回10條資料。這樣理解是錯誤的!
下面做一下詳細的分析:
請求首先可能是打到一個不包含這個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條資料。
如下圖所示: