point_in_time + search_after.
Đây là cách được khuyến nghị hiện nay; scroll API là cách cũ và đã bị deprecate cho use case này.
POST /products/_pit?keep_alive=5m
# -> {"id": "46ToAwMD..."}{
"size": 1000,
"pit": { "id": "46ToAwMD...", "keep_alive": "5m" },
"sort": [{ "_shard_doc": "asc" }],
"search_after": [12345]
}PIT giữ một view nhất quán của dữ liệu tại thời điểm mở, nên document ghi mới hoặc bị xoá trong lúc export không làm kết quả nhảy hoặc lặp.
Vì sao không dùng from/size: deep pagination tốn heap tuyến tính theo độ sâu và bị chặn ở 10.000.
Vì sao không dùng scroll: nó giữ segment cũ không cho merge trong suốt thời gian scroll, nên chạy lâu sẽ làm disk phình và cản trở merge.
Ba lưu ý vận hành: luôn đóng PIT khi xong (DELETE /_pit); sort theo _shard_doc rẻ hơn sort theo field nghiệp vụ; và chạy export vào giờ thấp điểm hoặc trỏ vào replica để không đụng đường dẫn nóng.