Vì deep pagination bắt mỗi shard phải trả về from + size hit rồi coordinating node sort lại toàn bộ. from=100000 nghĩa là mỗi shard gom 100.010 document — tốn heap tuyến tính theo độ sâu, dễ làm OOM cả cluster. Ngưỡng index.max_result_window mặc định 10.000 là để chặn việc đó.
Thay bằng search_after cho phân trang sâu:
json
{
"size": 20,
"sort": [{ "created_at": "desc" }, { "_id": "asc" }],
"search_after": [1737072000000, "prod-8891"]
}Tiêu chí sort phải unique (thêm _id để phá hoà) thì mới không lặp hoặc sót.
Kèm point_in_time nếu cần kết quả ổn định trong lúc dữ liệu vẫn đang thay đổi.
Đừng nâng max_result_window để "chữa" — đó là bỏ đi cái phanh chứ không phải sửa lỗi. Và với UI thật, gần như không ai bấm tới trang 500; giới hạn số trang rồi đẩy user sang lọc thêm là giải pháp sản phẩm tốt hơn.