Elasticsearch 深度分頁問題與 `search_after` 解決方案

1. 引言
  • 主題:介紹 Elasticsearch 深度分頁問題的背景,強調其在處理大規模數據集時的性能瓶頸。
  • 核心問題:傳統 from/size 分頁方式在深層分頁(例如第500頁)時,因需要加載和丟棄大量文檔,導致內存和 CPU 開銷過高。
  • 解決方案概覽:重點介紹 search_after 作為一種基于光標的分頁方法,解決深層分頁問題,并簡要提及其他方法(如 Scroll API 和 PIT)。

2. 深度分頁問題的原因
  • 內存和 CPU 開銷
    • from/size 需要從每個分片加載所有匹配文檔(包括前幾頁),協調節點排序后丟棄不需要的文檔。
    • 例如,請求第1000頁(from=9990, size=10),需處理前10000條文檔,資源開銷隨分頁深度指數級增長。
  • 默認限制
    • index.max_result_window 默認為 10,000,限制 from + size 的最大值,防止集群崩潰。
  • 結果不一致性
    • 分頁無狀態,動態索引更新可能導致文檔重復或丟失。
  • 分布式系統復雜性
    • 分布式環境下,分片獨立計算,協調節點合并排序,深層分頁增加負擔。

3. search_after 的詳細釋義
  • 定義
    • search_after 是一種基于光標(cursor-based)的分頁方法,通過記錄上一頁最后一個文檔的排序值(sort values)獲取下一頁數據。
    • 避免 from/size 加載和丟棄前頁文檔的開銷,適合深層分頁。
  • 工作原理
    1. 初始查詢指定 sortsize,獲取第一頁文檔及最后一個文檔的 sort 值。
    2. 后續查詢通過 search_after 傳入上一頁最后一個文檔的 sort 值,定位下一頁起點。
    3. 排序字段需唯一(通常結合 _id),確保分頁穩定。
  • 實現示例
    GET /my_index/_search
    {"size": 50,"sort": [{"timestamp": "asc"},{"_id": "asc"}],"search_after": [1650000000500, "50"],"query": {"match_all": {}}
    }
    
  • 結合 PIT
    • 使用 Point-in-Time API 創建索引快照,保證分頁一致性。
    • 創建 PIT:
      POST /my_index/_pit?keep_alive=1m
      
      響應
      {"id": "46ToAwMDaWR5b..."}
      
    • 使用 PIT 和 search_after
      GET /_search
      {"size": 50,"pit": {"id": "46ToAwMDaWR5b...","keep_alive": "1m"},"sort": [{"timestamp": "asc"},{"_id": "asc"}],"search_after": [1650000000500, "50"],"query": {"match_all": {}}
      }
      
    • 完成后刪除 PIT:
      DELETE /_pit
      {"id": "46ToAwMDaWR5b..."
      }
      
  • 優點
    • 高效:僅處理當前頁數據,內存和 CPU 開銷低。
    • 一致性:結合 PIT 保證動態索引環境下的結果一致。
    • 適合無限滾動和深層分頁。
  • 局限性
    • 不支持隨機跳頁(需順序遍歷)。
    • 排序字段需唯一,客戶端需管理 sort 值。
    • 開發復雜性略高。

4. 其他解決方案
  • Point-in-Time (PIT) API
    • 創建索引快照,結合 search_after 確保一致性。
    • 適合動態更新的索引,需管理 PIT ID。
  • Scroll API
    • 適合批量數據處理(如數據導出),通過搜索上下文逐批獲取結果。
    • 缺點:內存開銷大,不適合實時請求,需清除 scroll_id
  • 優化查詢和 UI 設計
    • 通過過濾器、聚合減少結果集。
    • 限制分頁深度,優化用戶體驗。
    • 使用高效排序字段,減少排序開銷。
  • 替代數據庫
    • 對于隨機跳頁需求,可考慮 PostgreSQL 或 Cassandra,但需權衡搜索性能。

5. 默認 size 參數
  • 默認值:Elasticsearch 的 size 參數默認值為 10,即未指定 size 時返回最多 10 條文檔。
  • 注意事項
    • index.max_result_window(默認 10,000)限制。
    • size 值可能影響性能,建議結合 search_after 或 Scroll 處理大數據量。

6. 最佳實踐
  • 優先使用 search_after 和 PIT:高效且一致,適合深層分頁。
  • 避免隨意調整 max_result_window:增加內存壓力,非長期解決方案。
  • 優化數據模型:使用高效字段(如 keywordlong)排序,控制分片數量。
  • 限制用戶行為:通過 UI 引導用戶使用過濾器或“下一頁”按鈕。
  • 監控資源:檢查 CPU 和內存使用,及時關閉 PIT 或 Scroll 上下文。

7. 總結
  • 核心問題:深度分頁因 from/size 的高開銷導致性能瓶頸。
  • 推薦方案search_after 結合 PIT 是深層分頁的最佳選擇,高效且支持一致性。
  • 適用場景:無限滾動、數據導出、深層分頁;不適合隨機跳頁。
  • 補充建議:優化查詢和 UI 設計,必要時考慮其他數據庫補充。

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

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

相關文章

Spring Boot 2整合MyBatis Plus詳細指南

1. 環境準備Spring Boot版本:2.x(推薦2.7.x)MyBatis Plus版本:3.5.x(兼容Spring Boot 2)數據庫:MySQL 8.0(其他數據庫需調整驅動)2. 創建項目并添加依賴在pom.xml中添加核…

Docker鏡像導入解析:docker import vs docker load

本文通過Busybox鏡像的實戰演示,深入剖析兩個易混淆命令的技術原理與適用場景一、核心區別速覽特性docker importdocker load輸入來源容器文件系統快照(docker export輸出)完整鏡像歸檔(docker save輸出)保留信息僅文件內容完整鏡像(層/歷史/配置/標簽)生成鏡像結構…

Android 解決鍵盤遮擋輸入框

本文目錄 點擊直達Android 解決鍵盤遮擋輸入框代碼實現使用注意最后我還有一句話要說梧桐葉上三更雨,葉葉聲聲是別離。Android 解決鍵盤遮擋輸入框 在安卓中通常可以通過添加android:windowSoftInputMode"adjustResize|stateHidden"的方式來讓鍵盤頂起布…

熱門JavaScript庫“is“等軟件包遭npm供應鏈攻擊植入后門

輕量級 JavaScript 實用工具庫 "is" 是 NPM 平臺上的熱門項目,每周下載量超過 220 萬次。然而在 2025 年 7 月 19 日,該庫開發者遭遇釣魚攻擊導致賬戶憑證泄露,攻擊者借此發布了包含遠程代碼執行后門的惡意版本。釣魚攻擊入侵開發者…

如何實現緩存音頻功能(App端詳解)

本方案提供了符合平臺規范的音頻緩存實現,通過分層設計確保功能可靠性,同時預留擴展點支持未來優化需求。📦 音頻緩存與播放流程說明 項目目標 實現App端音頻資源的自動緩存與播放: 獲取遠程音頻URL下載文件至本地_downloads/目錄…

從零到一:Django圖書管理系統完整開發實戰指南

作者:笙囧同學 身份:中科院計算機大模型方向碩士 | 全棧開發愛好者 座右銘:偷懶是人生進步的階梯 聯系方式:3251736703qq.com 可接課設,論文,專利輔導 全平臺賬號:笙囧同學 📖 前言 …

硬件電路設計(基本元器件)

一、電阻 1.電阻的基本概念 電阻是導體對電流阻礙作用的物理量,符號為R,單位為歐姆(Ω)。電阻的大小由導體的材料、長度、橫截面積和溫度共同決定。 電阻公式 導體的電阻R可通過以下公式計算: ρ:電阻率&…

R語言常用擴展包

R語言的強大之處很大程度上源于其豐富的擴展包(Packages)生態系統,目前CRAN( Comprehensive R Archive Network)上托管的擴展包已超過20,000個。以下是不同領域最常用的核心擴展包分類介紹: 一、數據處理與…

文件相關問題(AI回答)

一個進程打開一個文件,另一個進程能刪除這個文件嗎DeepSeek-R1 回答完成深度思考完成 用時10秒是的,?另一個進程可以刪除一個已被打開的文件?,但具體行為取決于操作系統和文件系統。以下是關鍵細節:1. ?Linux/Unix 的行為??刪…

三相四橋臂SVPWM控制及電機模型

三相四橋臂SVPWM控制策略及其在電機驅動中應用 一、三相四橋臂逆變器拓撲特性 1. 結構優勢 中性點控制:第四橋臂獨立調節中性點電壓,支持不平衡負載電壓利用率:相比傳統三橋臂提升15.47%,最大線電壓達U_{dc}硬件簡化:無…

deepseek+飛書多維表格 打造小紅書矩陣

通過AI技術平臺DeepSeek的數據分析與內容生成能力,結合飛書多維表格的智能化協作管理,實現小紅書矩陣賬號的高效運營。DeepSeek精準抓取熱點趨勢并生成爆款文案,飛書多維表格則提供可視化內容排期、多賬號數據看板及團隊任務分配功能&#xf…

4、如何生成分布式ID?

目錄 1、分布式ID介紹 什么是 ID? 什么是分布式 ID? 分布式 ID 需要滿足哪些要求? 2、分布式 ID 常見解決方案 1、數據庫 示例使用2: 2、數據庫號段模式 使用示例2: 一、核心設計思路 二、實現代碼 1. 數據庫表設計&…

Rust 實戰三 | HTTP 服務開發及 Web 框架推薦

往期回顧 Rust 實戰二 | 開發簡易版命令行工具 grepRust 實戰一 | 用 RustRover 開發猜數字游戲Rust 安裝與版本更新 代碼開源地址:https://github.com/0604hx/rust-journey 🚀 Web 框架 名稱性能(QPS)WebSocket / SSEGitHub ?…

墨者:SQL過濾字符后手工注入漏洞測試(第1題)

1. 墨者學院:SQL過濾字符后手工注入漏洞測試(第1題)🚀 2. 漏洞背景與測試思路🔍 在Web安全測試中,當遇到對輸入字符有過濾的SQL注入漏洞時,我們需要使用特殊技巧繞過過濾機制。本次測試的目標URL存在字符過濾&#xff…

深入解析 Vue 3 中 v-model 與表單元素的綁定機制

v-model 是 Vue 中最強大的指令之一,它簡化了表單數據雙向綁定的實現。本文將系統梳理各種 HTML 表單元素與 v-model 的綁定關系,特別是那些容易引起困惑的類型。一、v-model 的本質v-model 是一個語法糖,它實際上是 :value 和 input 的組合&…

【趙渝強老師】MySQL中的數據庫對象

MySQL數據庫中包含各自數據庫對象,常見的數據庫對象有:表、索引、視圖、事件、存儲過程和存儲函數等等。 視頻講解如下 【趙渝強老師】MySQL中的數據庫對象一、 創建與管理表 表是一種非常重要的數據庫對象,MySQL數據庫的數據都是存儲在表中…

Angular面試題目和答案大全

基礎概念篇1. 什么是Angular?它與AngularJS有什么區別?答案: Angular是由Google開發的基于TypeScript的開源Web應用框架,用于構建單頁應用程序(SPA)。Angular vs AngularJS對比:特性AngularJSAn…

CSS 語音參考

CSS 語音參考 概述 CSS(層疊樣式表)是用于描述HTML或XML文檔樣式的樣式表語言。它為網頁元素提供了一種統一的方式來定義字體、顏色、布局和其他視覺屬性。CSS語音參考旨在為開發者提供一個詳盡的指南,以便他們能夠更有效地使用CSS來增強網頁…

C# WPF 實現讀取文件夾中的PDF并顯示其頁數

文章目錄技術選型第一步:創建項目并安裝依賴庫第二步:定義數據模型 (Model)第三步:創建視圖模型 (ViewModel)第四步:設計用戶界面 (View)總結與解釋后記關于轉換器的錯誤工作中需要整理一些PDF格式文件,程序員的存在就…

設計模式(五)創建型:原型模式詳解

設計模式(五)創建型:原型模式詳解原型模式(Prototype Pattern)是 GoF 23 種設計模式中的創建型模式之一,其核心價值在于通過復制現有對象來創建新對象,而不是通過 new 關鍵字調用構造函數。它特…