Dùng _bulk với batch 5–15 MB, và tắt refresh + replica trong lúc nạp.
bash
PUT /products/_settings
{ "index": { "refresh_interval": "-1", "number_of_replicas": 0 } }
# ... chay bulk ...
PUT /products/_settings
{ "index": { "refresh_interval": "1s", "number_of_replicas": 1 } }
POST /products/_forcemerge?max_num_segments=1Vì sao có tác dụng: mỗi lần refresh tạo segment mới rồi phải merge, còn replica bắt mỗi document ghi hai lần. Tắt cả hai rồi bật lại sau khi nạp xong thường nhanh gấp nhiều lần.
Các điểm khác:
- Đo để tìm batch size, đừng đoán. Batch quá lớn gây circuit_breaking_exception.
- Chạy nhiều thread bulk song song, tăng dần tới khi thấy es_rejected_execution_exception (bulk queue đầy) rồi lùi lại.
- Để Elasticsearch tự sinh _id nếu không cần ID riêng — chỉ định _id bắt nó kiểm tra tồn tại trước mỗi lần ghi.
- Luôn kiểm tra errors trong response bulk: HTTP 200 vẫn có thể chứa document lỗi từng phần.