成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Elasticsearch深度分頁全解:從原理到跳頁實戰

數據庫 其他數據庫
在數據爆炸的時代,分頁查詢已成為系統標配功能。但當面對億級數據量時,傳統的分頁方式卻可能成為壓垮系統的最后一根稻草。本文將深入剖析Elasticsearch深度分頁的成因,并提供常見的解決方案.

在數據爆炸的時代,分頁查詢已成為系統標配功能。但當面對億級數據量時,傳統的分頁方式卻可能成為壓垮系統的最后一根稻草。本文將深入剖析Elasticsearch深度分頁的成因,并提供常見的解決方案.

1.深度分頁:你以為的翻頁,其實是性能炸彈

分頁機制剖析

當使用from+size進行分頁時,Elasticsearch的處理流程暗藏隱患

# 典型分頁請求示例
GET /orders/_search
{
  "from": 1000,
  "size": 10,
  "sort": [{"create_time": "desc"}]
}

處理流程

  • 客戶端請求第N頁數據(from = 1000, size = 10)
  • 協調節點向所有分片廣播查詢請求
  • 每個分片在內存中計算排序,準備前1010條結果
  • 合并所有分片返回的1010×分片數次數據
  • 最終截取第1000-1010條數據返回客戶端

性能災難三宗罪

# 查看默認最大分頁限制
GET /_settings?include_defaults
# 輸出結果片段
"index.max_result_window" : "10000"

致命影響

  • 內存黑洞:翻到第1000頁時,單個分片需處理1000×size數據量
  • 網絡風暴:分片數×數據量的跨節點傳輸消耗
  • 響應懸崖:頁碼超過max_result_window(默認1w)時直接報錯

2.破局之道:Search After與Scroll API原理解析

Search After(游標分頁核心原理)

graph LR
    A[請求第一頁] --> B(返回排序值游標)
    B --> C[攜帶游標請求下一頁]
    C --> D{是否還有數據}
    D -- 是 --> C
    D -- 否 --> E[結束查詢]

技術本質

  • 基于上一頁最后一條記錄的排序值進行分頁
  • 避免全局排序,僅保持單次查詢的順序一致性
  • 時間復雜度穩定為O(size)

適用場景

  • 移動端瀑布流瀏覽
  • 后臺連續分頁查詢
  • 需要實時性的分頁需求

Spring Boot實現

// 構建基礎查詢
SearchSourceBuilder builder = new SearchSourceBuilder()
    .size(10)
    .sort(SortBuilders.fieldSort("create_time").order(SortOrder.DESC))
    .sort(SortBuilders.fieldSort("_id")); // 保證排序唯一性
// 設置search_after參數
if (lastCreateTime != null && lastId != null) {
    builder.searchAfter(new Object[]{lastCreateTime, lastId});
}
SearchRequest request = new SearchRequest("orders")
    .source(builder);

Scroll API(滾動查詢)

核心原理

graph TB
    A[初始化Scroll] --> B(獲取scroll_id)
    B --> C[使用scroll_id分批獲取]
    C --> D{是否完成}
    D -- 否 --> C
    D -- 是 --> E[清除Scroll上下文]

技術本質

  • 創建查詢的快照視圖
  • 通過保持搜索上下文實現批次獲取
  • 適合非實時的大數據量處理

適用場景

  • 全量數據導出
  • 離線數據分析
  • 大數據遷移場景

Spring Boot實現

// 初始化滾動查詢
SearchRequest request = new SearchRequest("orders");
request.scroll(TimeValue.timeValueMinutes(1L)); // 保持上下文1分鐘
// 后續獲取批次數據
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueSeconds(30L));

3.跳頁難題解決方案

跳頁問題本質剖析

graph TD
    A[用戶請求第N頁] --> B{是否緩存過位置}
    B -- 是 --> C[直接使用緩存游標]
    B -- 否 --> D[估算近似位置]
    D --> E[二次校準查詢]
    E --> F[返回精確結果]

技術挑戰

  • 無法直接定位到任意偏移量
  • 傳統分頁方式性能不可接受
  • 需要平衡準確性與性能

混合分頁策略

public SearchResult queryProducts(int targetPage) {
    if (targetPage <= 100) {
        return traditionalPaging(targetPage); // 傳統分頁
    } else if (targetPage <= cachedMaxPage) {
        return searchAfterWithCache(targetPage); // 帶緩存的search_after
    } else {
        return timeRangeFilterPaging(targetPage); // 時間范圍過濾分頁
    }
}

跳頁緩存層設計

// Redis存儲分頁快照
public void cachePageSnapshot(int pageNum, Object[] searchAfterValues) {
    String key = "product_list:page:" + pageNum;
    redisTemplate.opsForValue().set(key, searchAfterValues, 5, TimeUnit.MINUTES);
}
// 獲取緩存游標
public Object[] getCachedSnapshot(int pageNum) {
    String key = "product_list:page:" + pageNum;
    return (Object[]) redisTemplate.opsForValue().get(key);
}

4.性能優化全景方案

實測數據對比

分頁方式

10頁耗時

100頁耗時

1000頁耗時

內存消耗

From/Size

120ms

450ms

超時失敗

Search_After

80ms

85ms

90ms

Scroll

100ms

110ms

120ms

測試環境:3節點集群,單個索引10個分片,500萬測試數據

5.最佳實踐指南

前端設計原則

  • 使用無限滾動替代傳統分頁
  • 提供精準過濾條件
  • 展示總條數范圍而非精確值

后端防御策略

// 分頁參數校驗
public void validatePageParams(int page, int size) {
    if (page > MAX_ALLOWED_PAGE) {
        throw new BusinessException("超出最大可查詢頁數");
    }
    if (size > 100) {
        throw new BusinessException("單頁數量不可超過100");
    }
}

監控預警方案

# 監控search_after上下文
GET _nodes/stats/indices/search?filter_path=**.open_contexts
# 檢查scroll上下文
GET _nodes/stats/indices/search?filter_path=**.scroll_current

當面對強制要求的精確跳頁場景時,可考慮預計算+二級緩存方案。通過定時任務預先建立熱點頁的游標映射表,結合短時緩存實現快速跳轉。您在實際項目中是如何解決這個難題的?

責任編輯:武曉燕 來源: JAVA充電
相關推薦

2025-05-13 08:25:00

模塊化編程JavaScript

2020-04-28 22:12:30

Nginx正向代理反向代理

2022-02-28 10:05:12

組件化架構設計從原組件化模塊化

2025-04-01 01:04:00

Redis集群緩存

2025-03-14 12:30:00

Redis RDBRedis數據庫

2025-05-28 08:45:00

2021-05-11 07:51:30

React ref 前端

2021-10-04 09:14:18

ElasticSear深度分頁

2024-07-07 21:49:22

2009-11-11 10:21:25

路由選擇協議

2018-05-17 15:18:48

Logistic回歸算法機器學習

2025-04-02 07:29:14

2018-03-30 18:17:10

MySQLLinux

2023-05-15 08:32:45

2010-06-29 14:20:52

2024-03-27 10:14:48

2023-08-03 08:03:05

2023-02-07 08:55:04

進程棧內存底層

2025-04-07 03:02:00

電腦內存數據

2021-12-13 06:56:46

漏洞Log4j對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产综合在线视频 | 午夜影院在线视频 | 日韩午夜在线播放 | 欧美日韩国产中文 | 密乳av | www.夜夜草| 在线观看a视频 | 日韩精品一区二区三区视频播放 | 亚洲码欧美码一区二区三区 | 免费在线观看一级毛片 | 国产香蕉视频 | 国产日韩一区二区三免费 | 成人不卡| 国产精品久久久久久久久图文区 | 一区二区三区久久久 | 日韩精品久久一区二区三区 | 91亚洲国产 | 成人超碰 | 一区二区三区成人 | 国产免费观看久久黄av片涩av | www.精品一区| 亚洲精品在线免费 | 日韩精品在线一区二区 | 成人精品国产免费网站 | 欧美中文字幕一区二区三区亚洲 | 一区二区视屏 | 久草在线 | 美女高潮网站 | 日本成人毛片 | 日韩亚洲欧美一区 | 男女视频在线观看免费 | 国产精品乱码一区二三区小蝌蚪 | 中文字幕一页二页 | 91久久久久久久久久久久久 | 国产精品久久久久aaaa九色 | 伊人狠狠操| 欧美精品福利视频 | 久久91精品国产一区二区三区 | 欧美一区二区三区日韩 | 久久99精品久久久久久狂牛 | 99色播|