最近在準備面試,正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解,以及高頻業務場景的應對策略系統梳理一遍,既能加深記憶,也能讓知識體系更扎實,供大家參考,歡迎討論。
在項目中遇到一個問題:之前同事在導出所有 IM 消息時,直接用 分頁查詢(from + size) 拉全量數據,當數據加起來超過1萬條后,Elasticsearch 報錯:
Result window is too large, from + size must be less than or equal to: [10000] but was [11000].
See the scroll api for a more efficient way to request large data sets.
這就是 ES 默認的 深分頁限制 導致的。
一、問題原因
Elasticsearch 默認的 index.max_result_window 設置為 10000。
查詢時,如果 from + size > 10000,就會報錯。注意是 from + size 一起不能超過10000條。
默認分頁只適合小數據量查詢,不適合一次性拉取所有數據。
二、解決方案
1. 臨時調整 index.max_result_window
通過修改索引配置提高限制,例如:
PUT 索引名稱/_settings?preserve_existing=true
{
“index.max_result_window”: “50000”
}
?? 這種方式會增加 ES 的內存和 CPU 消耗,不建議無限放大。
2. 調整java代碼使用 Scroll API
適合批量拉取大量數據,特點:
返回的是快照數據,不隨實時更新。
用完要清理 scroll 上下文。
更適合離線導出、批處理。
三、經驗總結
分頁查詢(from+size)只適合小數據量場景,不適合全量查詢。
大數據導出 → Scroll API
實時分頁展示 → Search After
特殊情況 → 調整 index.max_result_window(需謹慎)。
? 這次踩坑,就是因為用分頁直接查全量數據,超過了 ES 的默認限制。后續我們改用 Scroll API,順利解決。