当多个条件必须作用于数组中的同一个元素时,选择 nested。否则,不同元素的值可能意外地一起满足查询。
一个商品有两个变体
json
当多个条件必须作用于数组中的同一个元素时,选择 nested。否则,不同元素的值可能意外地一起满足查询。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠其中没有红色 L 码变体。但普通 object 映射会将这些字段扁平化为多个颜色和多个尺码,丢失颜色与尺码的对应关系。因此红色加 L 码的查询可能错误地匹配这个商品。
将 variants 映射为 nested,并把 color/size 映射为 keyword。然后使用:
{
"query": {
"nested": {
"path": "variants",
"query": {
"bool": {
"filter": [
{"term":{"variants.color":"red"}},
{"term":{"variants.size":"L"}}
]
}
}
}
}
}
两个过滤条件现在都在同一个 nested 元素内执行,所以示例商品不会匹配。把 L 改成 S,就可以匹配红色变体。
Nested 元素会创建额外的内部文档,查询成本也更高。如果无需保留数组内部的关系,普通 object 更简单。在认定映射正确之前,同时测试有效组合和跨元素组合。
官方文档.