【Elasticsearch】深度分頁及其替代方案

深度分頁及其替代方案

  • 1.深度分頁
  • 2.為什么不推薦深度分頁
    • 2.1 性能問題(核心原因)
    • 2.2 資源消耗對比
    • 2.3 實際限制
  • 3.深度分頁的替代方案
    • 3.1 方案一:Search After(推薦)
      • 3.1.1 為什么 Search After 性能更高
      • 3.1.2 技術原理簡化
      • 3.1.3 關鍵區別
      • 3.1.4 適用場景
    • 3.2 方案二:Scroll API(適用于大批量導出)
      • 3.2.1 詳細解釋
      • 3.2.2 類比理解
      • 3.2.3 注意事項
    • 3.3 方案三:基于時間范圍的分頁
    • 3.4 總結:如何選擇分頁方式

1.深度分頁

深度分頁 指的是在 Elasticsearch 中查詢結果集 非常靠后的頁碼(例如第 1000 1000 1000 頁,每頁 10 10 10 條數據,即 from=10000)。它通常表現為使用 from + size 參數組合來獲取遠端的分頁數據。例如:

GET /my_index/_search
{"from": 10000,  // 跳過前10000條"size": 10,     // 取10條"query": { ... }
}

2.為什么不推薦深度分頁

2.1 性能問題(核心原因)

Elasticsearch 的分頁原理是:

  • 協調節點 需要從所有分片(shard)收集滿足條件的文檔。
  • 計算全局排序后,臨時存儲 from + size 范圍內的所有文檔。
  • 最后返回 size 條結果。

問題

  • from 值很大時(如 from=100000),每個分片需要 先查 100000+size 條數據 到內存,再匯總排序。
  • 數據量越大,內存和 CPU 消耗呈線性增長,可能導致 內存溢出

2.2 資源消耗對比

分頁方式內存消耗響應時間適用場景
淺分頁(from=0低(僅緩存 size 條)毫秒級前幾頁數據
深度分頁(from=10000高(緩存 10000+size 條)秒級甚至超時不推薦直接使用

2.3 實際限制

  • Elasticsearch 默認限制:from + size ≤ 10,000(可通過 index.max_result_window 調整,但 調高會加劇風險)。
  • 即使調高限制,性能也會急劇下降。

3.深度分頁的替代方案

3.1 方案一:Search After(推薦)

原理

  • 利用上一頁的排序值(如 _shard_doc 或自定義字段)作為游標。
  • 不跳過記錄,直接定位到下一頁的起始點。

示例

// 第一頁
GET /blog_posts/_search
{"size": 10,"sort": [  // 必須包含唯一性字段(如 _id){ "publish_date": "desc" },{ "_id": "asc" }]
}// 后續頁(用上一頁最后一條的排序值)
GET /blog_posts/_search
{"size": 10,"search_after": ["2023-04-05", "abc123"],  // 上一頁最后記錄的 publish_date 和 _id"sort": [{ "publish_date": "desc" },{ "_id": "asc" }]
}

優點

  • 性能穩定(不受頁碼影響)。
  • 適合無限滾動、批量導出等場景。

3.1.1 為什么 Search After 性能更高

用一個生活中的例子來理解:假設你要在圖書館的 100萬本書 中,每次找 10本 符合特定條件的書,并按出版日期排序。

  • 傳統分頁(from/size)的做法
    • 你要第 1000 頁(即第 9991-10000 本書)。
    • 圖書管理員必須:
      1. 先取出前 10000 本書,堆在桌子上(內存)。
      2. 排序這 10000 本,扔掉前 9990 本。
      3. 最后給你第 9991-10000 本。
    • 問題:每次翻到深頁碼,都要重復 “取書 + 排序 + 扔書” 的過程,桌子(內存)可能堆不下!
  • Search After 的做法
    • 你記住 當前看到的最后一本書的出版日期和編號(例如:“2023-05-01, 編號ABC123”)。
    • 下次直接告訴圖書管理員:“我要比【2023-05-01, ABC123】更早的10本書”。
    • 圖書管理員:
      1. 直接定位到這本書的位置(通過索引)。
      2. 往后數 10 本給你。
    • 優勢:不需要臨時存儲前面的 9990 本書!

🚀 簡而言之:Search After 快是因為它 不傻乎乎地從頭數,而是像書簽一樣 “記住位置”,直接跳到下一頁開始的地方。

3.1.2 技術原理簡化

分頁方式工作方式性能消耗
from/size每次從頭計算,臨時存儲 from+size 條數據from 增大 指數級上升
search_after像書簽一樣記住位置,直接跳轉恒定(與頁碼無關)

3.1.3 關鍵區別

  • from/size
    • 類似 “每次從第一頁開始翻”
    • 計算:(from + size) × 分片數 → 內存爆炸 💥
  • search_after
    • 類似 “記住看到哪里,接著往下讀”
    • 計算:size × 分片數內存恒定 📊

3.1.4 適用場景

  • from/size
    • 前幾頁(如首頁、搜索結果前 10 條)
  • search_after
    • 無限滾動(如微博、朋友圈)
    • 深度分頁(如第 100 頁+)

3.2 方案二:Scroll API(適用于大批量導出)

原理

  • 創建快照(snapshot),保持查詢上下文。
  • 逐批獲取數據,類似數據庫游標。

示例

// 1. 初始化 Scroll(保留1分鐘)
GET /blog_posts/_search?scroll=1m
{"size": 100,"query": { "match_all": {} }
}// 2. 后續獲取(用返回的 scroll_id)
GET /_search/scroll
{"scroll": "1m", "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gB..."
}// 3. 最后手動清理
DELETE /_search/scroll
{"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gB..."
}

優點: 適合非實時、大數據量導出(如報表生成)。

缺點

  • 不支持實時數據(快照期間數據變化不會反映)。
  • 占用服務器資源,用完需手動清理(DELETE /_search/scroll)。

3.2.1 詳細解釋

  • scroll=1m 的含義
    • 1m = 1 分鐘(時間單位,類似 30s = 30秒2h = 2小時
    • 表示 Elasticsearch 會保留這次 Scroll 查詢的上下文(如排序結果、快照數據)1 分鐘。
    • 超時后,Scroll 會自動失效,資源被釋放。
  • 為什么需要設置超時?
    • Scroll 會占用服務器內存和資源,長時間不釋放可能導致性能問題。
    • 設置超時(如 1m)是讓 Elasticsearch 自動清理 不再使用的 Scroll 查詢。
  • 如何調整超時?
    • 根據數據量調整,例如:
      • 大數據導出:scroll=5m 5 5 5 分鐘)
      • 小批量查詢:scroll=30s 30 30 30 秒)
  • 續期 Scroll
    如果處理時間較長,可以在每次請求時刷新超時時間:
    GET /_search/scroll
    {"scroll": "1m",  // 重新設置為1分鐘"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVY..."
    }
    

3.2.2 類比理解

把 Scroll 想象成圖書館的 “臨時書架”

  • 你告訴圖書管理員:“我需要 1 分鐘(scroll=1m)來挑書”。
  • 1 分鐘內,書架上的書(查詢結果)保持不變,你可以慢慢選。
  • 超時后,圖書管理員會把書架清空(釋放資源)。
  • 如果你需要更多時間,可以喊:“再給我 1 分鐘!”(續期 Scroll)。

3.2.3 注意事項

  • 不要濫用長超時(如 scroll=1h),否則可能導致集群內存壓力。
  • 用完務必清理(即使未超時):
    DELETE /_search/scroll
    {"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gB..."
    }
    
  • Scroll 適用于離線任務(如導出數據),不適用于實時分頁。

3.3 方案三:基于時間范圍的分頁

原理

  • 用時間字段(如 publish_date)作為分頁條件。
  • 每頁查詢限定時間范圍。

示例

GET /blog_posts/_search
{"size": 10,"query": {"range": {"publish_date": { "lte": "2023-03-01" }  // 第二頁改為 "lte": "上一頁的最小日期"}},"sort": [ { "publish_date": "desc" } ]
}

適用場景

  • 按時間線分頁(如新聞列表)。

3.4 總結:如何選擇分頁方式

場景推薦方案原因
用戶前端分頁(前幾頁)from + size簡單易用,性能可接受
深度分頁(如第 100 100 100 頁)Search After避免內存爆炸,性能穩定
大數據量導出Scroll API適合離線處理,但需注意資源釋放
按時間滾動時間范圍查詢利用業務字段天然分頁

關鍵建議

  • 禁止生產環境使用大 from 值(如 from=100000)。
  • 若必須調整 index.max_result_window,需評估集群資源。
  • Search After 是深度分頁的最佳實踐,兼容大多數場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

論文閱讀筆記——VGGT: Visual Geometry Grounded Transformer

VGGT 論文 輸入是 N 個 RGB 圖像 I i ∈ R 3 H W I_i\in\mathbb{R}^{3HW} Ii?∈R3HW 的序列 ( I i ) i 1 N (I_i)^N_{i1} (Ii?)i1N?,觀察相同 3D 場景。 VGGT 的 Transformer 是一個映射函數,將此序列映射為一組對應的 3D 標注, f ( …

【嵌入式電機控制#11】PID控制入門:對比例算法應用的深度理解

接下來內容需要數學功底,并且有現成結論的內容不做推導,重在講解工程實踐中的方法論,建議控制類專業或學習過相關理論的人閱讀 一、開閉環系統 (1)開環控制系統:被控對象輸出對控制器的輸出沒有影響 &…

多視圖幾何:本質矩陣與基礎矩陣

文章目錄 1. 前置知識1.1. 向量叉乘1.2. 混合積1.3. 引理證明 2. 本質矩陣3. 基礎矩陣4. 應用例子 1. 前置知識 1.1. 向量叉乘 假設 a ( a x a y a z ) \mathbf{a} \begin{pmatrix} a_x \\ a_y \\ a_z \end{pmatrix} a ?ax?ay?az?? ? 以及 b ( b x b y b z ) \mat…

Hive集群之間遷移的Linux Shell腳本

新舊 Hive 集群之前數據遷移單表腳本 migrate_hive_single_table.sh #!/bin/bash#配置參數 OLD_NAMENODE"hdfs://<old-namenode>:<old-port>" EXPORT_PATH"/tmp/hive-export/dm" NEW_DB"dm_events" TABLE_NAME"dm_usereventfi…

新時代的開始,華為開源倉頡編程語言!

7月30日&#xff0c;華為即將開源自研的倉頡編程語言。 倉頡這個名字很有意思。傳說中的倉頡創造了漢字&#xff0c;開啟了中華文明的文字時代。華為用這個名字&#xff0c;體現了對中華文化的致敬。從2020年開始研發&#xff0c;到去年首次亮相&#xff0c;再到現在的全面開源…

【python實用小腳本-128】基于 Python 的 Hacker News 爬蟲工具:自動化抓取新聞數據

引言 在技術社區中&#xff0c;Hacker News 是一個匯聚最新技術文章和討論的熱門平臺。許多開發者和技術愛好者依賴它來獲取行業動態和前沿資訊。然而&#xff0c;手動瀏覽和篩選這些文章可能耗時且低效。本文將介紹一個基于 Python 的 Hacker News 爬蟲工具&#xff0c;它能夠…

mac 電腦安裝Homebrew來安裝npm與node成功后,安裝nvm的流程

文章目錄 前言一、卸載node(如果沒下載可以忽略這步)1.官網下載安裝包的2. homebrew安裝的 二、安裝Homebrew(1) 命令安裝&#xff08;2&#xff09;出現上面提示&#xff0c;執行對應的命令&#xff08;3&#xff09;校驗是否安裝成功 三&#xff1a;安裝node&#xff08;Home…

根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作,導出.b3dm加載到谷歌地圖cesiumlab

根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作&#xff0c;導出.b3dm加載到谷歌地圖cesiumlab 根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作&#xff0c;導出.b3dm加載到谷歌地圖cesiumlab

Yocto項目:嵌入式Linux開發的“萬能烹飪手冊”

目錄 一.Yocto是什么? 二.Yocto如何運作&#xff1f; 2.1 三大核心工具 2.2 實例 三.為什么開發者愛用Yocto&#xff1f; 3.1 ?自由定制&#xff0c;拒絕“全家桶”?? 3.2 跨平臺支持&#xff1a;從x86到火星芯片? 3.3 工業級可靠性? PetaLinux是Xilinx官方推出的…

【nosql】有哪些非關系型數據庫?

非關系型數據庫Nosql 分類 鍵值存儲 (Key-Value Store): 代表: Redis, DynamoDB, RocksDB, etcd核心優勢: 極致簡單、超高讀寫性能&#xff08;尤其內存型&#xff09;、高吞吐。場景: 緩存、會話存儲、配置、計數器、分布式協調、簡單消息隊列。 列式 / 寬列存儲 (Wide-Colu…

Redis存儲Cookie實現爬蟲保持登錄 requests | selenium

前言 前面已經介紹了requests和selenium這兩種方式的基礎知識和模擬登錄,但是我們需要每次都進行登錄,這明顯是很麻煩并且不合理的,所以這次我分享一下怎么可以讓我們的程序進行一次登錄之后,和普通瀏覽器一樣下次不進行登錄直接進行對網站數據的爬取 下面的我分享的內容需要…

leetcode:474. 一和零[01背包][動態規劃]

學習要點 給定背包容量&#xff0c;裝滿背包最多有多少個物品深入理解01背包深入理解動態規劃 題目鏈接 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法:01背包 class Solution { public:int findMaxForm(vector<string>& strs, int m, int …

UE5 使用過程遇到的問題

切換緩存位置 進入界面&#xff0c;選擇-編輯-編輯器偏好設置搜索緩存&#xff0c;找到通用全局&#xff0c;修改本地DCC路徑到要切換的位置 閃退報錯 Fatal: Failed to get dll export function: cuvidGetDecoderCaps [NVDEC] 因為NVIDIA驅動沒有卸載干凈&#xff0c;使用D…

2025 BSidesMumbaiCTF re 部分wp

XORyy 附件拖入ida。明文 idkwhattonamethis 附件拖入ida 前三個函數都是檢查環境&#xff0c;跳過即可 長度為5&#xff0c;可以根據flag格式求解。腳本。盡管多解但是可能的結果很少 Diff_EQ 附件拖入ida z3求解等式&#xff0c;腳本。無反調試的情況下本地可以驗證&#xff…

圖靈完備之路(數電學習三分鐘)----邏輯與計算架構

經過前面幾節的學習&#xff0c;我們已經有了簡單的數電知識&#xff0c;下面&#xff0c;我們將正式進入設計簡單圖靈完備機的工作&#xff0c;首先&#xff0c;我們要設計出具有邏輯運算與計算功能的簡單結構&#xff1a; 1.邏輯架構 首先&#xff0c;該架構能實現多種邏輯…

【C++筆記】AVL樹的深度剖析

【C筆記】AVL樹的深度剖析 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;C筆記 文章目錄【C筆記】AVL樹的深度剖析前言一. AVL樹的概念二.AVL樹的實現2.1 AVL樹的結構2.2 AVL樹的插入2.3 平衡因子更新三.旋轉3.1旋轉的原則3.2右單旋3.3左單…

支持向量機(SVM)在肝臟CT/MRI圖像分類(肝癌檢測)中的應用及實現

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

DeepSeek掃雷游戲網頁版HTML5(附源碼)

用DeepSeek幫忙生成一個網頁版的掃雷游戲&#xff0c;效果非常棒&#xff0c;基于HTML5實現&#xff0c;方便運行。 提示詞prompt 幫我做一個網頁版的 html5 掃雷游戲游戲功能說明 游戲難度&#xff1a; 1 簡單&#xff1a;1010 格子&#xff0c;10個地雷 2 中等&#xff1a;16…

Day53GAN對抗生成網絡思想

生成對抗網絡&#xff08;GAN&#xff09;是深度學習領域的一種革命性模型&#xff0c;由Ian Goodfellow等人于2014年提出。其核心思想源于博弈論中的零和博弈&#xff0c;通過兩個神經網絡&#xff08;生成器和判別器&#xff09;的對抗性訓練&#xff0c;實現數據的高質量生成…

meilisearch-輕量級搜索引擎

meilisearch是一款開源的輕量級搜索引擎&#xff0c;相比于elasticsearch等重量級搜索引擎&#xff0c;meilisearch注重數據搜索&#xff0c;從而而省去了其它不必要的功能&#xff08;如支持聚合分析、分布式搜索等特性&#xff09;&#xff0c;以便于快速上手開發和構建應用。…