Thao tác CRUD trên tài liệu Elasticsearch thông qua giao diện Kibana

Tổng quan các thao tác cơ bản với chỉ mục và tài liệu

Elasticsearch (ES) là hệ thống tìm kiếm và phân tích dữ liệu dựa trên tài liệu JSON. Bài viết này trình bày cách thực hiện các thao tác tạo, đọc, cập nhật và xóa (CRUD) trên chỉ mục và tài liệu thông qua API REST — không phụ thuộc vào plugin Kibana như tiêu đề gốc gợi ý, mà tập trung vào cơ chế cốt lõi của ES, phù hợp với phiên bản 7.x trở lên.

1. Quản lý chỉ mục: Tạo và xoá

Trong ES 7.x+, khái niệm type đã bị loại bỏ hoàn toàn. Các yêu cầu tạo chỉ mục giờ đây không cần chỉ định type, và cấu trúc chỉ mục được đơn giản hoá.

1.1 Tạo chỉ mục với cấu hình rõ ràng

PUT /product_catalog?pretty
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": { "type": "text", "analyzer": "ik_smart" },
      "price": { "type": "float" },
      "in_stock": { "type": "boolean" },
      "tags": { "type": "keyword" },
      "created_at": { "type": "date" }
    }
  }
}

Kết quả trả về:

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "product_catalog"
}

Lưu ý: Việc khai báo tường minh number_of_shards tránh cảnh báo lỗi thời liên quan đến giá trị mặc định thay đổi từ 5 → 1 kể từ phiên bản 7.0.

1.2 Xoá chỉ mục

DELETE /product_catalog?pretty

Phản hồi thành công:

{ "acknowledged": true }

2. Cấu trúc tài liệu trong Elasticsearch

Mỗi tài liệu là một đối tượng JSON có tính linh hoạt cao, hỗ trợ lồng ghép (nested objects), mảng, và kiểu dữ liệu đa dạng. Không yêu cầu lược đồ cố định — nhưng trong môi trường production, luôn nên định nghĩa mappings trước khi đưa dữ liệu vào để đảm bảo tính nhất quán và hiệu năng truy vấn.

Ví dụ tài liệu sản phẩm:

{
  "title": "Máy tính xách tay Dell XPS 13",
  "price": 28990000,
  "in_stock": true,
  "tags": ["laptop", "dell", "xps"],
  "specifications": {
    "cpu": "Intel Core i7-1185G7",
    "ram": "16GB LPDDR4X",
    "storage": "512GB SSD"
  },
  "created_at": "2024-03-15T08:22:00Z"
}

3. Thêm tài liệu (Create)

Sử dụng phương thức PUT với ID được chỉ định rõ:

PUT /product_catalog/_doc/1001
{
  "title": "Máy tính xách tay Dell XPS 13",
  "price": 28990000,
  "in_stock": true,
  "tags": ["laptop", "dell", "xps"],
  "specifications": {
    "cpu": "Intel Core i7-1185G7",
    "ram": "16GB LPDDR4X",
    "storage": "512GB SSD"
  },
  "created_at": "2024-03-15T08:22:00Z"
}

Kết quả:

{
  "_index": "product_catalog",
  "_id": "1001",
  "_version": 1,
  "result": "created",
  "_shards": { "total": 2, "successful": 1, "failed": 0 }
}

4. Truy vấn tài liệu (Read)

Dùng phương thức GET để lấy tài liệu theo ID:

GET /product_catalog/_doc/1001

Phản hồi chứa phần _source với nội dung đầy đủ:

{
  "_index": "product_catalog",
  "_id": "1001",
  "_version": 1,
  "found": true,
  "_source": {
    "title": "Máy tính xách tay Dell XPS 13",
    "price": 28990000,
    "in_stock": true,
    "tags": ["laptop", "dell", "xps"],
    "specifications": { ... },
    "created_at": "2024-03-15T08:22:00Z"
  }
}

5. Cập nhật tài liệu (Update)

Có hai cách tiếp cận chính:

5.1 Ghi đè toàn bộ (Index replacement)

Dùng lại PUT với cùng ID — toàn bộ nội dung sẽ được thay thế:

PUT /product_catalog/_doc/1001
{
  "title": "Dell XPS 13 (2024 Edition)",
  "price": 29490000,
  "in_stock": false,
  "tags": ["laptop", "dell", "xps", "2024"],
  "created_at": "2024-03-15T08:22:00Z"
}

Lưu ý: Trường specifications sẽ bị mất nếu không bao gồm trong yêu cầu.

5.2 Cập nhật từng phần (Partial update)

Sử dụng endpoint _update với phương thức POST:

POST /product_catalog/_update/1001
{
  "doc": {
    "in_stock": true,
    "last_updated": "2024-04-10T14:30:00Z"
  }
}

Chỉ hai trường trên được cập nhật; các trường còn lại giữ nguyên giá trị cũ.

6. Xoá tài liệu (Delete)

DELETE /product_catalog/_doc/1001

Phản hồi:

{
  "_index": "product_catalog",
  "_id": "1001",
  "_version": 3,
  "result": "deleted",
  "_shards": { "total": 2, "successful": 1, "failed": 0 }
}

Xác minh bằng lệnh GET — kết quả trả về "found": false.

Thẻ: Elasticsearch rest-api CRUD JSON mapping

Đăng vào ngày 18 tháng 6 lúc 19:36