Kiểu object mặc định làm phẳng mảng, nên quan hệ giữa các field trong cùng một phần tử bị mất.
json
"variants": [
{ "color": "red", "size": "S" },
{ "color": "blue", "size": "L" }
]
// index thanh: variants.color = ["red","blue"], variants.size = ["S","L"]Hậu quả: query tìm color=red AND size=L vẫn khớp document này dù không có variant nào như vậy. Đây là bug rất khó phát hiện vì kết quả trông hợp lý.
Cách sửa là khai báo nested:
json
"variants": { "type": "nested", "properties": { ... } }json
{ "nested": { "path": "variants",
"query": { "bool": { "filter": [
{ "term": { "variants.color": "red" } },
{ "term": { "variants.size": "L" } }
]}}}}Cái giá của nested: mỗi phần tử được lưu thành một Lucene document riêng ẩn, nên index phình, update một phần tử phải reindex cả document cha, và query đắt hơn.
Chỉ dùng khi thật sự cần giữ quan hệ trong phần tử.