最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Elasticsearch深度分頁(yè)問(wèn)題的解決方案詳解

 更新時(shí)間:2026年03月30日 09:24:25   作者:盡興-  
ES?是分布式搜索引擎,數(shù)據(jù)分布在多個(gè)分片上,本文將深入探討Elasticsearch深度分頁(yè)問(wèn)題及其解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

一、深度分頁(yè):是什么?為什么會(huì)出現(xiàn)問(wèn)題?

1.1 什么是深度分頁(yè)

  • 查詢(xún)耗時(shí)隨頁(yè)碼深度?指數(shù)級(jí)增長(zhǎng)?;
  • 內(nèi)存與 CPU 資源消耗劇增;
  • 超過(guò)閾值后直接被 ES 拒絕。

1.2 ES 分頁(yè)的底層執(zhí)行機(jī)制(from + size)

ES 是分布式搜索引擎,數(shù)據(jù)分布在多個(gè)分片上。標(biāo)準(zhǔn)分頁(yè)(from + size)的執(zhí)行流程如下:

  1. ?請(qǐng)求分發(fā)?:協(xié)調(diào)節(jié)點(diǎn)將查詢(xún)廣播至所有分片;
  2. ?分片執(zhí)行?:每個(gè)分片獨(dú)立查詢(xún)并返回 from + size 條記錄 到內(nèi)存;
  3. ?結(jié)果匯總?:協(xié)調(diào)節(jié)點(diǎn)收集所有分片的結(jié)果(共 N × (from + size) 條);
  4. ?二次排序 + 裁剪?:全局排序后,僅保留 [from, from + size) 區(qū)間的數(shù)據(jù)返回。

核心痛點(diǎn)?:當(dāng) from = 10000, size = 100 時(shí),每個(gè)分片需加載 10100 條數(shù)據(jù),協(xié)調(diào)節(jié)點(diǎn)需對(duì) 所有分片的 10100 條 進(jìn)行全局排序——最終卻只返回 ?100 條?!資源浪費(fèi)極其嚴(yán)重。

1.3 ES 的保護(hù)機(jī)制:max_result_window

為防止 OOM,ES 默認(rèn)設(shè)置:

index.max_result_window = 10000

from + size ≤ 10000,否則拋出異常。

示例:每頁(yè) 20 條 → 最多翻到第 ?500 頁(yè)?;

可通過(guò)以下方式修改(?不推薦隨意調(diào)大?):

PUT /your_index/_settings
{
  "index.max_result_window": 20000
}

1.4 為什么不能簡(jiǎn)單調(diào)大max_result_window?

調(diào)大閾值只是 ?**“掩蓋問(wèn)題”**?,而非解決問(wèn)題:

  • 分片仍需加載大量數(shù)據(jù)到堆內(nèi)存;
  • 協(xié)調(diào)節(jié)點(diǎn)排序壓力劇增,極易觸發(fā) Full GC 或 OOM;
  • 分布式環(huán)境下,分片越多,性能衰減越快。

二、ES 三大分頁(yè)方式深度對(duì)比

維度from + sizescroll APIsearch_after
性能? 深度翻頁(yè)性能差?? 中等(快照開(kāi)銷(xiāo))? 高性能
翻頁(yè)能力? 支持隨機(jī)跳頁(yè) ? 受限于 10000? 僅向后翻頁(yè) ? 支持全量遍歷? 僅向后翻頁(yè) ? 無(wú)限深度
實(shí)時(shí)性? 實(shí)時(shí)??非實(shí)時(shí)?(快照)??近實(shí)時(shí)?(PIT 輕量視圖)
資源占用? 高(深度時(shí))?? 中(上下文駐留內(nèi)存)? 低
ES 官方推薦基礎(chǔ)場(chǎng)景?ES7+ 已不推薦?ES7.10+ 主推方案
使用復(fù)雜度? 簡(jiǎn)單?? 需管理 scroll_id?? 需管理 PIT+ 排序值

2.1from + size:基礎(chǔ)但危險(xiǎn)

語(yǔ)法示例

GET /index/_search
{
  "query": { "match_all": {} },
  "from": 0,
  "size": 10
}

適用場(chǎng)景

  • 小數(shù)據(jù)集(≤10000 條);
  • PC 端支持 隨機(jī)跳頁(yè) 的搜索(如百度、京東);
  • 后臺(tái)管理系統(tǒng)。

限制

  • ?絕對(duì)不可用于深度分頁(yè)?;
  • 超過(guò) max_result_window 直接失敗。

2.2scrollAPI:全量遍歷的“老方案”

核心原理

  • 首次查詢(xún)創(chuàng)建 ?數(shù)據(jù)快照?(snapshot);
  • 后續(xù)通過(guò) scroll_id 獲取下一批數(shù)據(jù);
  • 快照基于首次查詢(xún)時(shí)刻,?后續(xù)寫(xiě)入不可見(jiàn)?。

使用流程

?首次查詢(xún)?(帶 scroll 參數(shù)):

GET /index/_search?scroll=5m
{
  "query": { ... },
  "size": 100
}

?后續(xù)翻頁(yè)?:

POST /_search/scroll
{
  "scroll": "5m",
  "scroll_id": "xxx"
}

?手動(dòng)清理?(重要?。?/p>

DELETE /_search/scroll
{ "scroll_id": "xxx" }

適用場(chǎng)景

  • 數(shù)據(jù)導(dǎo)出、遷移、批量處理;
  • 不要求實(shí)時(shí)性的后臺(tái)任務(wù)。

缺陷

  • ?非實(shí)時(shí)?;
  • 上下文長(zhǎng)期駐留內(nèi)存,易造成資源泄漏;
  • ?ES 7+ 官方已不推薦用于分頁(yè)?。

2.3search_after:官方主推的深度分頁(yè)方案 

核心優(yōu)勢(shì)

  • 基于 游標(biāo)(cursor) 思想,無(wú)深度限制;
  • 使用 Point In Time (PIT) 保證一致性;
  • 資源占用遠(yuǎn)低于 scroll
  • 支持 ?近實(shí)時(shí)查詢(xún)?。

關(guān)鍵要求

  • ?必須指定排序字段?;
  • ?**必須包含唯一決勝字段(tiebreaker)**?,如 _id,避免重復(fù)或跳過(guò)數(shù)據(jù)。

使用流程

創(chuàng)建 PIT(Point In Time)

POST /index/_pit?keep_alive=5m

→ 返回 pit_id

首次查詢(xún)

GET /_search
{
  "query": { "term": { "status": "active" } },
  "pit": { "id": "pit_id", "keep_alive": "1m" },
  "size": 20,
  "sort": [
    { "timestamp": "asc" },
    { "_id": "asc" }  // ← 唯一決勝字段!
  ]
}

后續(xù)翻頁(yè)(使用上一頁(yè)最后一條的排序值)

GET /_search
{
  "query": { "term": { "status": "active" } },
  "pit": { "id": "pit_id", "keep_alive": "5m" },
  "size": 20,
  "sort": [
    { "timestamp": "asc" },
    { "_id": "asc" }
  ],
  "search_after": [1678901234567, "doc_999"]  // ← 上一頁(yè)最后一條的值
}

釋放 PIT(可選但推薦)

DELETE /_pit
{ "id": "pit_id" }

適用場(chǎng)景

  • APP ?下拉加載更多?(天然向后翻頁(yè));
  • 電商商品列表、內(nèi)容流(超 10000 條);
  • 對(duì)性能和一致性有要求的 C 端業(yè)務(wù)。

三、深度分頁(yè)的根本解決策略

策略 1:產(chǎn)品設(shè)計(jì)上規(guī)避深度分頁(yè)(最優(yōu)解)

最好的優(yōu)化,是不讓問(wèn)題發(fā)生。

  • ?PC 端?:隱藏“跳轉(zhuǎn)到第 N 頁(yè)”,僅保留“上一頁(yè)/下一頁(yè)”;
  • ?限制最大頁(yè)數(shù)?:如淘寶、京東僅展示前 ?100 頁(yè)?;
  • ?移動(dòng)端?:采用 ?無(wú)限下拉加載?,天然適配 search_after。

策略 2:按業(yè)務(wù)場(chǎng)景精準(zhǔn)選型

業(yè)務(wù)場(chǎng)景推薦方案原因
PC 搜索 / 后臺(tái)管理(需跳頁(yè))from + size支持隨機(jī)跳頁(yè),且控制在 10000 內(nèi)
數(shù)據(jù)導(dǎo)出 / 批量處理scroll全量遍歷,無(wú)需實(shí)時(shí)
APP 下拉 / 超長(zhǎng)列表search_after高性能、無(wú)限深度、近實(shí)時(shí)

策略 3:用search_after實(shí)現(xiàn)高性能深度分頁(yè)

若必須深度分頁(yè),請(qǐng)嚴(yán)格遵循以下最佳實(shí)踐:

  1. ?排序字段必須含唯一決勝字段?(如 _id);
  2. ?PIT 過(guò)期時(shí)間合理設(shè)置?(如 1~5 分鐘),可在每次請(qǐng)求中續(xù)期;
  3. ?單次 size 控制在 20~100?,平衡性能與請(qǐng)求次數(shù);
  4. ?查詢(xún)結(jié)束后主動(dòng)刪除 PIT?,避免資源泄漏。

策略 4:集群級(jí)輔助優(yōu)化

  • ?合理分片?:避免過(guò)多分片(建議 ≤ 節(jié)點(diǎn)數(shù) × 2);
  • ?提升協(xié)調(diào)節(jié)點(diǎn)配置?:高內(nèi)存 + 多核 CPU;
  • ?關(guān)閉非必要排序?:若無(wú)需排序,可按 _doc(最快);
  • ?**使用路由(routing)**?:減少查詢(xún)涉及的分片數(shù)。

四、總結(jié)與核心建議

核心結(jié)論

  1. from + size ≠ 深度分頁(yè)方案 —— 僅適用于 ≤10000 條的隨機(jī)翻頁(yè);
  2. scroll 已過(guò)時(shí) —— 僅用于非實(shí)時(shí)全量處理;
  3. search_after 是未來(lái) —— ES 7.10+ 官方主推,性能與一致性兼得;
  4. 產(chǎn)品設(shè)計(jì) > 技術(shù)調(diào)優(yōu) —— 限制用戶(hù)行為是最高效解法。

落地建議

  • ?產(chǎn)品側(cè)?:PC 限頁(yè)數(shù),APP 用下拉;
  • ?開(kāi)發(fā)側(cè)?:封裝 search_after 工具類(lèi),統(tǒng)一處理 PIT 與游標(biāo);
  • ?運(yùn)維側(cè)?:監(jiān)控堆內(nèi)存、GC 頻率,防止 OOM;
  • ?架構(gòu)側(cè)?:新項(xiàng)目?**直接放棄 scroll**?,全面擁抱 search_after

到此這篇關(guān)于Elasticsearch深度分頁(yè)問(wèn)題的解決方案詳解的文章就介紹到這了,更多相關(guān)Elasticsearch深度分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

宜城市| 锦屏县| 房产| 潜山县| 南通市| 山西省| 宜兴市| 旬阳县| 文水县| 固阳县| 东至县| 德昌县| 百色市| 类乌齐县| 塔城市| 耿马| 依兰县| 光泽县| 新密市| 桐梓县| 青海省| 遵化市| 苏尼特左旗| 清苑县| 汉阴县| 永宁县| 百色市| 临澧县| 东港市| 北辰区| 沈丘县| 勃利县| 皮山县| 丰都县| 灌云县| 河东区| 天等县| 遂溪县| 高邮市| 奎屯市| 揭西县|