我有一份汽车文件索引。汽车可以选择。选项是可以包含可用性对象的嵌套对象。我的映射看起来像这样:
{
"car": {
"properties": {
"carId": {
"type": "long"
},
"carName": {
"type": "string",
"index": "not_analyzed"
},
"option": {
"type": "nested",
"properties": {
"optionId": {
"type": "long"
},
"optionName": {
"type": "string",
"index": "not_analyzed"
},
"availability": {
"type": "nested",
"properties": {
"from": {
"type": "long"
},
"to": {
"type": "long"
}
}
}
}
}
}
}
}
我索引了以下2个汽车文件。 一辆(酷车)带AC选项:
{
"carId": 100,
"carName": "cool car",
"option": {
"optionId": 10,
"optionName": "AC",
"availability": {
"from": 12345,
"to": 67890
}
}
}
另一辆(不酷车)没有选择:
{
"carId": 200,
"carName": "uncool car"
}
当我搜索带有AC选项的汽车时,我按照预期得到了“酷车”:
{
"query": {
"nested": {
"filter": {
"term": {
"option.optionId": 10
}
},
"path": "option"
}
}
}
现在最大的问题是:如何才能获得没有AC选项的汽车?我在查询中添加了一个not-filter,但是没有返回任何内容:
{
"query": {
"nested": {
"filter": {
"not": {
"filter": {
"term": {
"option.optionId": 10
}
}
}
},
"path": "option"
}
}
}
非常感谢提前!
答案 0 :(得分:1)
我认为你非常接近,但嵌套过滤器的位置搞砸了。我们想要否定嵌套过滤器的结果,而不是从否定过滤器中找到嵌套文档。
这是我的解决方案:
{
"filter": {
"not": {
"filter": {
"nested": {
"path": "option",
"query": {
"filtered": {
"filter": {
"term": {
"option.optionId": 10
}
}
}
}
}
}
}
}
}
来自文档:
The query path points to the nested object path, and the query (or filter) includes the query that will run on the nested docs matching the direct path