0

Khám Phá `runtime_mappings` trong Elasticsearch: Tính Năng Thú Vị Cho Developer!

Chào các bạn developer! Hôm nay, chúng ta sẽ cùng nhau khám phá một tính năng cực kỳ hữu ích trong Elasticsearch mang tên runtime_mappings. Đây là một công cụ tuyệt vời giúp bạn tạo ra các trường động mà không cần phải thay đổi mapping của index. Hãy cùng tìm hiểu cách mà runtime_mappings có thể giúp bạn tối ưu hóa truy vấn và xử lý dữ liệu một cách linh hoạt nhé!


1. Tại Sao Nên Dùng runtime_mappings?

1.1. Tính Toán Dữ Liệu Động

Bạn có thể tạo ra các trường ảo (virtual fields) dựa trên dữ liệu có sẵn. Ví dụ, nếu bạn muốn chuẩn hóa giá trị hoặc tính toán một giá trị mới từ các trường hiện có, runtime_mappings sẽ là người bạn đồng hành lý tưởng.

Ví dụ: Chuyển Đổi Định Dạng Dữ Liệu

GET my_index/_search
{
  "runtime_mappings": {
    "normalized_price": {
      "type": "double",
      "script": {
        "source": "emit(doc['price'].value * 1.1)"
      }
    }
  },
  "query": {
    "match_all": {}
  },
  "fields": ["normalized_price"]
}

Ứng dụng: Giúp chuẩn hóa giá trị mà không cần phải thay đổi dữ liệu gốc.


1.2. Cải Thiện Hiệu Suất

Thay vì phải cập nhật toàn bộ index khi có thay đổi, bạn có thể sử dụng runtime_mappings để tạo các trường tính toán động. Điều này giúp tiết kiệm thời gian và tài nguyên.

Ví dụ: Hiển Thị Ngày Giờ Chuẩn

GET my_index/_search
{
  "runtime_mappings": {
    "formatted_date": {
      "type": "keyword",
      "script": {
        "source": "emit(new Date(doc['timestamp'].value * 1000).toInstant().toString())"
      }
    }
  },
  "query": {
    "match_all": {}
  },
  "fields": ["formatted_date"]
}

Ứng dụng: Hiển thị dữ liệu theo định dạng mong muốn mà không cần thay đổi cách lưu trữ.


1.3. Tạo Chỉ Mục Động

Nếu bạn cần tạo dữ liệu mới chỉ phục vụ cho truy vấn mà không cần lưu trữ lâu dài, runtime_mappings sẽ giúp bạn làm điều đó một cách dễ dàng.

Ví dụ: Phân Loại Văn Bản

GET my_index/_search
{
  "runtime_mappings": {
    "text_category": {
      "type": "keyword",
      "script": {
        "source": """
        if (doc['content'].size() == 0) {
          emit('empty');
        } else if (doc['content'].value.length() > 100) {
          emit('long');
        } else {
          emit('short');
        }
        """
      }
    }
  },
  "query": {
    "match": {
      "text_category": "long"
    }
  }
}

Ứng dụng: Truy vấn trên các dữ liệu động mà không cần lưu trữ trường mới trong index.


2. Khi Nào Nên Dùng runtime_mappings?

✅ Khi bạn cần thêm một trường mới mà không muốn cập nhật mapping của index.
✅ Khi bạn cần thực hiện tính toán động trên dữ liệu mà không muốn thay đổi dữ liệu gốc.
✅ Khi bạn muốn thử nghiệm các loại dữ liệu mới mà không cần tái lập chỉ mục.
✅ Khi bạn muốn giảm kích thước lưu trữ bằng cách không lưu các trường được tạo ra từ script.

Không Nên Dùng runtime_mappings Khi:

  • Cần hiệu suất truy vấn cao (runtime fields chậm hơn so với fields được lập chỉ mục).
  • Trường đó cần được sử dụng thường xuyên trong các truy vấn hoặc phân tích (nên lập chỉ mục để tối ưu hiệu suất).

3. Tóm Tắt

  • runtime_mappings giúp tạo các trường động mà không cần thay đổi index.
  • Dùng để chuẩn hóa dữ liệu, hiển thị định dạng mới, hoặc tính toán động.
  • Giảm nhu cầu tái lập chỉ mục, nhưng có thể ảnh hưởng đến hiệu suất nếu dùng nhiều.

Nếu bạn có một trường hợp cụ thể cần tối ưu bằng runtime_mappings, hãy cho mình biết! 🚀


Ứng Dụng runtime_mappings Trong E-commerce

Trong một hệ thống thương mại điện tử, runtime_mappings có thể giúp tối ưu truy vấn, tính toán dữ liệu động mà không cần sửa đổi index, đồng thời giảm thiểu chi phí lưu trữ và tái lập chỉ mục. Dưới đây là một số use case thực tế:

1. Điều Chỉnh Giá Sản Phẩm

E-commerce thường có các chương trình giảm giá. Thay vì lưu trữ nhiều mức giá khác nhau, bạn có thể dùng runtime_mappings để tính toán giá cuối cùng theo thời gian thực.

Ví dụ: Tính Giá Cuối Cùng

GET products/_search
{
  "runtime_mappings": {
    "final_price": {
      "type": "double",
      "script": {
        "source": "emit(doc['base_price'].value * (1 - doc['discount_percent'].value / 100))"
      }
    }
  },
  "query": {
    "match_all": {}
  },
  "fields": ["product_name", "final_price"]
}

Lợi ích: Tính toán giá động mà không cần tái lập chỉ mục.


2. Hiển Thị Đơn Vị Tiền Tệ Phù Hợp

E-commerce hoạt động đa quốc gia cần hiển thị giá sản phẩm theo đơn vị tiền tệ của từng khu vực.

Ví dụ: Quy Đổi Giá Sang JPY

GET products/_search
{
  "runtime_mappings": {
    "price_in_jpy": {
      "type": "double",
      "script": {
        "source": "emit(doc['base_price'].value * doc['exchange_rate_usd_to_jpy'].value)"
      }
    }
  },
  "query": {
    "match_all": {}
  },
  "fields": ["product_name", "price_in_jpy"]
}

Lợi ích: Dễ dàng thay đổi tỷ giá mà không cần cập nhật dữ liệu sản phẩm.


3. Phân Loại Sản Phẩm

E-commerce có hàng triệu sản phẩm với nhiều thuộc tính khác nhau. runtime_mappings có thể giúp phân loại sản phẩm theo nhóm động mà không cần lưu trữ trường phân loại riêng.

Ví dụ: Phân Loại Theo Trọng Lượng

GET products/_search
{
  "runtime_mappings": {
    "weight_category": {
      "type": "keyword",
      "script": {
        "source": """
        if (doc['weight_kg'].value < 1) {
          emit('Lightweight');
        } else {
          emit('Heavy');
        }
        """
      }
    }
  },
  "query": {
    "match": {
      "weight_category": "Lightweight"
    }
  }
}

Lợi ích: Dễ dàng điều chỉnh cách phân loại mà không cần thay đổi index.


Tóm Tắt Lợi Ích Của runtime_mappings Trong E-commerce

Use Case Lợi Ích
Tính Toán Giá Động Điều chỉnh giá theo khuyến mãi mà không cần tái lập chỉ mục
Chuyển Đổi Tiền Tệ Hiển thị giá theo đơn vị tiền tệ khác nhau mà không lưu nhiều bản sao dữ liệu
Phân Loại Sản Phẩm Tự động nhóm sản phẩm theo trọng lượng, kích thước, danh mục giá
Tạo Bộ Lọc Tìm Kiếm Hỗ trợ Faceted Search mà không cần lưu sẵn nhóm dữ liệu
Xếp Hạng Sản Phẩm Thứ tự hiển thị dựa trên rating mà không thay đổi dữ liệu gốc

💡 Khi Nào Nên Dùng runtime_mappings?
✅ Khi bạn cần xử lý dữ liệu động mà không muốn thay đổi index.
✅ Khi bạn cần giảm chi phí lưu trữ và tối ưu hiệu suất tìm kiếm.
✅ Khi bạn muốn thử nghiệm các cách phân loại mà không cần tái lập chỉ mục.

Nếu bạn có một use case cụ thể hơn cần tối ưu, hãy cho mình biết! 🚀


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.