ElasticSearch最佳入門實踐(三十五)分頁搜尋以及deep paging效能問題深度揭祕
阿新 • • 發佈:2018-11-07
1、如何使用es進行分頁搜尋的語法
size,from
GET /_search?size=10
GET /_search?size=10&from=0
GET /_search?size=10&from=20
假設將這6條資料分成3頁,每一頁是2條資料,來實驗一下這個分頁搜尋的效果
2、什麼是deep paging問題?為什麼會產生這個問題,它的底層原理是什麼?
deep paging 簡單來說就是檢索的特別深
比如共有60000條資料,每個shard上分配了 20000 條資料,每頁是10條資料,這個時候,你檢索到第 1000 頁,實際上要拿到的是 10001 ~ 10010 這個範圍的資料 。 因為所有的資料是分佈在3個shard上的,可能檢索的時候還有各種條件,各種聚合分析,那這個範圍的資料該怎麼拿到。
發起請求後,你的請求可能是打到一個不包含這個 index 的 shard 的 node 上去,那麼這個 node 就是一個 coordinate node ,那麼這個 coordinate node 就會把檢索請求轉發到 index 的三個 shard 所在的 node 上去
在剛剛假設的前提下,要檢索 60000 條資料的 第 1000 頁,而60000 條資料還是分佈在3個 node 上。實際上在檢索的時候,每個shard 都要將自己內部的20000 條資料的 第 10001 ~~ 10010 條資料拿出來。不是10 條,而是10010 條資料。三個shard 每個都要返回10010條資料給coordinate node ,coordinate node 會收到共 30030條資料,然後在這些資料中進行排序,_score,相關度分數,然後取到排位最高的10條資料,也就是我們需要的 第 1000 頁的 10 條資料給使用者。
在檢索這個過程中 coordinate node 會儲存大量的資料,還要進行大資料量的排序,排序之後,再取出對應那一頁,所以這個過程中,耗費的網路頻寬,記憶體,cpu,所以 deep paging 的效能問題 我們應該儘量避免這種操作