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