Khám Phá Tính Năng runtime_mappings
Trong Elasticsearch
Chào các bạn! Hôm nay, chúng ta sẽ cùng khám phá một tính năng cực kỳ hữu ích trong Elasticsearch, đó là runtime_mappings
. Đây là một công cụ mạnh mẽ cho phép bạn tạo ra các trường động mà không cần 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 Sử Dụng runtime_mappings
?
1.1. Tính Toán Dữ Liệu Động
Với runtime_mappings
, bạn có thể dễ dàng tạo ra các trường ảo (virtual fields) dựa trên dữ liệu có sẵn. Chẳng hạn, 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ó, đây chính là công cụ lý tưởng.
Ví dụ: Chuyển Đổi Định Dạng Dữ Liệu
json
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 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
json
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
json
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 Sử 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 Nội Dung
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 Thương Mại Điện Tử
Trong 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 vài ứng dụng thực tế:
1. Điều Chỉnh Giá Sản Phẩm
E-commerce thường có các chương trình khuyến mãi. 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
json
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
Các trang thương mại điện tử 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
json
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
json
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 Thương Mại Điện Tử
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! 🚀
source: viblo