成人免费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

2024-03-27 10:14:48

2010-06-29 14:20:52

2023-08-03 08:03:05

2025-04-07 03:02:00

電腦內存數據

2023-02-07 08:55:04

進程棧內存底層

2021-12-13 06:56:46

漏洞Log4j對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看av免费 | 91麻豆精品国产91久久久久久 | 日韩成人免费视频 | 99国产精品视频免费观看一公开 | 天天干天天操天天看 | 精品国产色 | 一区二区精品 | 欧美视频在线播放 | 国产成人99久久亚洲综合精品 | 亚洲第一av | 综合第一页 | 久夜精品 | 韩国成人在线视频 | 亚州毛片 | 国产精品美女久久久久久久网站 | 欧美国产激情 | www.色午夜.com | 一区二区三区中文字幕 | 亚洲午夜精品 | 色婷婷av777 av免费网站在线 | 亚洲国内精品 | 久久综合一区二区三区 | 亚洲综合二区 | 超碰在线人人 | 高清国产一区二区 | av一区二区三区四区 | 一区亚洲| 日韩不卡在线观看 | 欧美一级片在线看 | 精品成人在线视频 | 日韩视频在线观看一区二区 | 精品在线看 | 欧美精品一二区 | 日韩欧美在线观看视频 | 黄色免费av | www.亚洲一区二区 | 97中文视频 | 色综合久久久 | 日本一区二区三区四区 | 日韩1区 | 国产精品影视 |