背景說明
業務場景中需要做基於ES的分頁查詢,而ES存儲了上億條數據,且數據每天還在不斷增長,如何做分頁查詢呢(注意查詢效率)?
本質就是一個深度分頁查詢的問題,很多人可能會嘗試ES自帶的滾動查詢機制。但在大數據量情況下,此種方式是行不通的(不信的可以自行嘗試哦)。
方案前提
1. 產品側:在大數據量分頁情況下,產品層面不允許用戶自行輸入頁碼跳頁;
2. 技術側:ES數據有全局唯一且有序的ID,可以通過相關算法生成。
方案設計
1.核心設計思想
經分析,用戶的點擊跳頁行為數據偏移量是有限的。且第1頁和最后1頁的跳轉行為可以有效識別,那么可以將用戶的點擊查詢行為分為幾個場景:
用戶點擊第1頁:可以按照正常的邏輯進行查詢,根據數據要求的排序方向進行順序查詢或倒序查詢;
用戶點擊最后1頁:首先判斷是否是最后1頁;重新計算頁數據展示大小;如果結果是按順序展示,則先按倒序方向進行數據查詢,再將結果進行翻轉展示。如果結果按倒序展示反之操作即可;
用戶點擊其他頁:此種情況較為復雜。因為要重新計算數據的偏移量,所以需要有用戶上次點擊的頁碼信息(例如上次點擊頁碼及對應的第1條數據ID和最后1條數據ID等)進行參照計算。詳見下面的圖例展示。
2.方案設計
2.1 定義接口參數
2.2 數據查詢邏輯
第1頁查詢:
最后1頁查詢:
其他頁查詢:
代碼實現
java及PHP代碼都已上傳到個人gitee上。(重點說明:代碼僅供學習參考使用,未經作者同意,請勿用於商業用途)。