Hướng Dẫn Chi Tiết Về Các Trường Metadata Trong Elasticsearch

Elasticsearch tự động gắn liền với mỗi document một bộ các trường hệ thống, gọi chung là Metadata Fields. Những trường này do engine tự quản lý, phục vụ cho việc tối ưu hóa chỉ mục, định tuyến phân tán và lưu trữ thông tin nguồn gốc dữ liệu.

Các Trường Định Danh Tài Liệu

Mỗi tài liệu đều sở hữu các giá trị xác định duy nhất trên toàn hệ thống.

_index - Chỉ Mục Gốc

Trường này xác định tên của index mà tài liệu đang nằm trong đó. Đây là trường ảo (virtual field), không được lưu trữ vật lý vào Lucene, chỉ có tác dụng tham chiếu.

Gợi ý mô hình hóa dữ liệu: Nên gom nhóm các document có cấu trúc tương đồng vào cùng một index để tối ưu hiệu năng. Đối với các index tập trung nhiều vào truy vấn (query-heavy), nên cân nhắc tách riêng shard để tránh ảnh hưởng đến các thao tác nặng về thống kê (aggregation).

Lưu ý quan trọng khi đặt tên index: bắt buộc viết thường, không được bắt đầu bằng dấu gạch dưới "_", và tuyệt đối không chứa dấu phẩy ",".

Bạn có thể sử dụng _index trong các câu lệnh truy vấn (Query), sắp xếp (Sort), hay Aggregations. Ví dụ, thực hiện tìm kiếm song song qua nhiều chỉ mục:

GET shop_data,cms_content/_search
{
    "query": {
        "terms": {
            "_index": ["shop_data", "cms_content"]
        }
    },
    "aggs": {
        "count_by_index": {
            "terms": { "field": "_index", "size": 5 }
        }
    }
}

_id - Mã Số Định Danh

Là chuỗi ký tự độc nhất dành cho mỗi tài liệu trong cùng một index (và type nếu tồn tại). Nếu người dùng không chủ động truyền tham số này khi tạo lập, Elasticsearch sẽ tự sinh ra một UUID ngẫu nhiên.

Tương tự như _index, bạn có thể truy xuất _id trong script hoặc dùng nó để định vị chính xác một bản ghi cụ thể.

# Lấy một vài id cụ thể từ kết quả tìm kiếm
GET inventory/_search
{
    "query": {
        "ids": {
            "values": ["prod-101", "prod-102"]
        }
    }
}

_type - Phân Loại Tài Liệu (Legacy)

Trước ES 7, đây là trường chỉ định loại nội dung bên trong index. Hiện tại, trong các phiên bản mới, khái niệm multi-type đã bị loại bỏ hoàn toàn để đơn giản hóa cấu trúc dữ liệu. Tuy nhiên, kiến thức này vẫn hữu ích khi làm việc với các hệ thống cũ.

_uid - Tổng Hợp Thông Tin (Internal)

Là trường nội bộ hợp nhất giữa _type_id theo cú pháp type#id. Mặc dù hỗ trợ truy vấn, nhưng API truy cập trực tiếp tới _uid đã dần bị khai tử (deprecation), khuyến khích chuyển hướng sử dụng _id.

Các Trường Lưu Trữ Nội Dung

Nhóm trường này liên quan trực tiếp đến dữ liệu thực tế mà chúng ta nạp vào Elasticsearch.

_source - Dữ Liệu Gốc

Elasticsearch mặc định lưu giữ nguyên vẹn chuỗi JSON ban đầu vào trường _source. Điều này giúp trả về kết quả đầy đủ cho ứng dụng client và hỗ trợ các tác vụ chỉnh sửa một phần (partial update). Trường này không được chỉ mục hóa để tìm kiếm nhưng lại tiêu tốn dung lượng đĩa.

Bạn có thể điều khiển mức độ bao lưu của _source thông qua Mapping tại thời điểm tạo Index:

# Tắt hoàn toàn lưu trữ _source (Lưu ý: Việc này có giới hạn)
PUT logs_db
{
    "mappings": {
        "doc_type": {
            "_source": {
                "enabled": false
            }
        }
    }
}

# Hoặc lọc bớt các trường lớn, nhạy cảm
PUT events
{
    "mappings": {
        "log_entry": {
            "_source": {
                "includes": ["event_id", "timestamp"],
                "excludes": ["raw_message", "password_hash"]
            }
        }
    }
}

Trong quá trình tìm kiếm, bạn cũng có thể yêu cầu loại bỏ trường này khỏi kết quả trả về bằng cách thiết lập tham số:

GET /products/doc_id?_source=false

Với các phiên bản hiện đại, để tăng hiệu suất truy vấn nhanh hơn, thay vì dùng _source_includes, hãy sử dụng _source_includes (có 's' ở cuối) để liệt kê chi tiết các trường mong muốn.

_size - Kích Thước Byte

Trường này ghi nhận tổng dung lượng byte mà phần _source chiếm giữ. Nó thường được cung cấp bởi các plugin bổ trợ (mapper-size plugin) để hỗ trợ giám sát chi phí lưu trữ.

Các Trường Hỗ Trợ Indexing

_field_names - Danh Sách Trường Có Giá Trị

Trường này lưu trữ tên của tất cả các thuộc tính (fields) trong tài liệu đang chứa giá trị hợp lệ (không null). Nó hữu ích khi bạn cần xác định xem một cột dữ liệu cụ thể nào đó đã được điền vào chưa mà không cần đọc toàn bộ _source.

_all - Tìm Kiếm Tất Cả (Deprecated)

Trước ES 6, _all là một trường đặc biệt gom hết nội dung của mọi trường khác trong một văn bản. Hiện tại tính năng này đã bị tắt.

Phương án thay thế: Sử dụng directive copy_to trong mapping để ghép nối nội dung của nhiều trường về một trường mới dùng để tra cứu:

PUT articles
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "body": { "type": "text" },
      "summary": { 
        "type": "text",
        "copy_to": "full_text_search" 
      }
    }
  }
}

Khi cấu hình như vậy, nội dung từ bodysummary sẽ được sao chép vào full_text_search để phục vụ tìm kiếm toàn diện.

Cơ Chế Định Tuyến (Routing)

Để kiểm soát vị trí lưu trữ của dữ liệu trên cluster, ES cung cấp cơ chế routing.

_routing - Định Tuyến Thủ Công

Cho phép người dùng chủ động xác định shard cụ thể nơi document sẽ được lưu bằng cách truyền tham số routing. Công thức tính toán shard dựa trên hash của giá trị này chia modulo cho số lượng shard chính (primary_shards).

# Thiết lập custom routing key là user_group_id
PUT customer_order/order_55?routing=group_A
{
    "order_status": "pending",
    "total_amount": 50000
}

Để đảm bảo hiệu năng, khi thực hiện các thao tác UPDATE, DELETE hay SEARCH cho document này, bạn luôn phải cung cấp giá trị routing tương ứng nếu không nó sẽ gây lỗi hoặc tìm nhầm.

_parent - Quan Hệ Cha Con (Removed)

Tính năng liên kết cha con (parent-child join) giữa các types trong cùng một index đã bị loại bỏ khỏi các phiên bản mới nhằm giải quyết sự phức tạp về hiệu năng. Trước đây, nó cho phép tạo quan hệ phụ thuộc giữa các tài liệu thông qua tham chiếu ID cha.

Thủ Tục Thêm Dữ Liệu Riêng

_meta - Thông Điệp Ứng Dụng

Dù Elasticsearch không dùng trường này cho hoạt động nội bộ, developer có thể tùy ý gán dữ liệu vào _meta trong định nghĩa mapping. Ví dụ như lưu phiên bản schema, lớp xử lý backend (class name) hoặc các cờ trạng thái đặc biệt mà chỉ ứng dụng đọc được.

PUT data_layer
{
  "mappings": {
    "entity": {
      "_meta": {
        "api_version": "v2.1",
        "model_class": "com.service.UserModel"
      },
      "properties": { ... }
    }
  }
}

Thẻ: Elasticsearch meta-fields metadata search-engine Routing

Đăng vào ngày 14 tháng 6 lúc 07:42