Ba cách, theo mức độ tin cậy tăng dần:
1. Dual write — service ghi DB xong ghi luôn sang Elasticsearch. Đơn giản nhưng không có bảo đảm: ghi DB xong mà service chết thì Elasticsearch thiếu document vĩnh viễn.
2. Polling theo updated_at — job chạy định kỳ quét record mới. Dễ làm, nhưng bỏ sót record bị xoá (cần soft delete) và có độ trễ.
3. CDC qua WAL (Debezium + Kafka) — bắt thay đổi từ replication log của Postgres. Đáng tin cậy nhất, không sót, không phải sửa ứng dụng, nhưng thêm hạ tầng phải vận hành.
Một lựa chọn trung gian hay dùng: ghi DB trong transaction cùng với một bảng outbox, rồi một worker đọc outbox đẩy sang Elasticsearch. Được tính atomic của DB mà không cần Kafka.
Dù chọn cách nào cũng phải có job đối soát định kỳ: đếm và so updated_at giữa hai bên, và có sẵn đường reindex lại toàn bộ từ DB — coi Elasticsearch là read model dựng lại được, không phải nơi giữ dữ liệu.