Không đổi tại chỗ được — phải tạo index mới với mapping đúng, _reindex sang, rồi chuyển alias.
Alias là thứ khiến việc này không downtime, nên luôn cho ứng dụng trỏ vào alias chứ không phải index name.
bash
PUT /products_v2 { "mappings": { ... } }
POST /_reindex?wait_for_completion=false
{ "source": { "index": "products_v1" }, "dest": { "index": "products_v2" } }
POST /_aliases
{ "actions": [
{ "remove": { "index": "products_v1", "alias": "products" } },
{ "add": { "index": "products_v2", "alias": "products" } }
]}Bước chuyển alias là atomic, không có khoảnh khắc nào không có index nào phục vụ.
Với index lớn, reindex chạy hàng giờ nên dùng wait_for_completion=false rồi theo dõi bằng GET _tasks. Dữ liệu ghi mới trong lúc reindex sẽ bị sót — xử lý bằng cách ghi song song vào cả hai index, hoặc chạy một lần reindex bù theo range trên updated_at trước khi switch.
Giữ products_v1 vài ngày sau khi switch để rollback được bằng đúng một lệnh alias.