Thao Tác CRUD Với Elasticsearch Thông Qua Giao Thức CURL

Tổng quan về cURL trong hệ sinh thái ES

cURL (Client URL) là tiện ích mã nguồn mở hỗ trợ các thao tác truyền tải dữ liệu thông qua giao thức URL trên terminal. Đối với Elasticsearch, đây là cách tiếp cận tiêu chuẩn để tương tác với REST API mà không cần phụ thuộc vào các client đồ họa phức tạp. Trên môi trường Linux phổ biến như CentOS, công cụ này thường đã có sẵn hoặc dễ dàng cài đặt thông qua package manager.

Các tham số cốt lõi để thiết lập yêu cầu HTTP bao gồm:

  • -X: Xác định phương thức HTTP cần thực hiện (GET, POST, PUT, DELETE).
  • -d: Cung cấp payload dữ liệu, thường ở định dạng JSON.
  • -H: Thiết lập các header của request, đặc biệt quan trọng cho việc chỉ định kiểu nội dung.

Kiểm tra trạng thái kết nối

Trước khi bắt đầu thao tác dữ liệu, hãy đảm bảo dịch vụ Elasticsearch đang hoạt động bằng cách gửi yêu cầu GET đến cổng mặc định:

curl -XGET 'http://localhost:9200'

Nếu trả về thông tin chi tiết về phiên bản và cluster, kết nối đã thành công.

Xây dựng Cấu trúc Lưu trữ (Index)

Một Index đóng vai trò như kho lưu trữ chính. Lệnh dưới đây sử dụng phương thức PUT để khởi tạo tên chỉ mục ecommerce_db.

curl -XPUT 'http://localhost:9200/ecommerce_db'

Quy tắc đặt tên Index: Tên phải viết thường hoàn toàn, tránh ký tự dấu gạch dưới (_) đứng đầu và tuyệt đối không chứa dấu phẩy. Mặc dù cả PUT và POST đều có thể dùng để tạo, nhưng PUT thường được ưu tiên cho các thao tác ghi đè hoặc cập nhật chắc chắn hơn.

Đưa Tài Liệu Vào Hệ Thống

Để nạp tài liệu (document) vào Index, cần cung cấp thêm phần thân (body) dạng JSON. Từ phiên bản ES 6.0 trở đi, mọi yêu cầu có nội dung đều bắt buộc phải khai báo Content-Type.

Cấu trúc URL cơ bản: ///.

Trường hợp không cung cấp ID, ES sẽ tự động tạo một chuỗi ngẫu nhiên, khi đó chỉ nên dùng POST.

Ví dụ: Chèn dữ liệu cho sản phẩm với ID doc_001:

curl -H'Content-Type: application/json' -XPUT 'http://localhost:9200/ecommerce_db/products/doc_001' -d '{
  "name": "Macbook Pro",
  "specs": {
    "cpu": "Apple M1",
    "ram": "16GB"
  },
  "location": "San Francisco"
}'

Phương Thức Truy Vấn Dữ Liệu

Elasticsearch cung cấp nhiều tùy chọn để truy xuất thông tin đã lưu:

Tìm kiếm theo Tham Số Q

Sử dụng tham số ?q=field:value để lọc nhanh kết quả tìm kiếm theo cú pháp Simple Query String:

curl -XGET 'http://localhost:9200/ecommerce_db/products/_search?q=location:"San Francisco"&pretty'

Lấy Thông Tin Theo ID Đơn Giản

Truy cập trực tiếp tài liệu thông qua ID duy nhất:

curl -XGET 'http://localhost:9200/ecommerce_db/products/doc_001?pretty'

Giới Hạn Trường (Source Filtering)

Nếu chỉ muốn lấy giá trị của một hoặc vài trường cụ thể thay vì toàn bộ JSON response, sử dụng tham số _source:

curl -XGET 'http://localhost:9200/ecommerce_db/products/doc_001?_source=name&pretty'

Kỹ Thuật Cập Nhật (Update)

Có hai cách chính để xử lý việc sửa đổi dữ liệu hiện có:

1. Cập Nhật Toàn Bộ (Replace)

Công việc này thực chất là xóa tài liệu cũ và ghi mới hoàn toàn. Nếu bạn không gửi đầy đủ các trường dữ liệu cũ, các trường còn thiếu sẽ bị mất đi sau lệnh thực thi.

curl -H 'Content-Type:application/json' -XPOST 'http://localhost:9200/ecommerce_db/products/doc_001/_update' -d '{
  "doc": {
    "specs": {
      "cpu": "Intel i9"
    }
  }
}'

Lưu ý: Trong ví dụ thực tế trên, nếu không chỉ rõ toàn bộ dữ liệu gốc, cấu trúc nested có thể bị mất trừ khi dùng đúng cách.

2. Cập Nhật Từng Phần (Partial Update)

Mệnh lệnh này an toàn hơn, nó cho phép sửa đổi riêng biệt một trường nào đó mà không làm ảnh hưởng đến các thông tin khác. Thường dùng endpoint _update với payload chứa từ khóa doc.

curl -H 'Content-Type:application/json' -XPOST 'http://localhost:9200/ecommerce_db/products/doc_001/_update' -d '{"doc":{"price": 1500}}'

Xóa Dữ Liệu

Sử dụng phương thức DELETE để loại bỏ tài liệu khỏi phân vùng. Phản hồi trả về sẽ cho biết trạng thái tồn tại và phiên bản hiện tại của tài liệu.

curl -XDELETE 'http://localhost:9200/ecommerce_db/products/doc_001?pretty'

Trong cơ chế phân tán, việc xóa tài liệu mang tính "mềm" (soft delete). Dữ liệu thực sự bị dọn dẹp khỏi đĩa cứng trong quá trình merge segment sau này, nhưng đánh dấu xóa ngay lập tức giúp đồng bộ hóa các node khác nhau tránh xung đột phiên bản.

Thẻ: Elasticsearch cURL rest-api JSON document-management

Đăng vào ngày 4 tháng 7 lúc 12:25