我有一个带有嵌套数据的ES索引,它像这样映射
"mappings": {
"voertuig": {
"properties": {
"vestiging": {
"properties": {
"name_dtc": {
"type": "string",
"fields": {
"raw": {
"index": "not_analyzed",
"type": "string"
}
}
},
},
"type": "nested"
},
"accessoires": {
"properties": {
"name": {
"type": "string",
"fields": {
"raw": {
"index": "not_analyzed",
"type": "string"
}
}
}
},
"type": "nested"
}
}
}
}
我想在两个(原始)值上创建一个过滤的查询。我能够创建一个过滤器来过滤其中一个值,如下所示:
{
"body": {
"post_filter": {
"nested": {
"filter": {
"bool": {
"must": [
{
"term": {
"vestiging.name_dtc.raw": "Location X"
}
}
]
}
},
"path": "vestiging"
}
},
"query": {
"match_all": { }
}
},
"index": "ocm",
"type": "voertuig"
}
然而,我需要的是这样的事情:
{
"body": {
"post_filter": {
"nested": [
{
"filter": {
"bool": {
"must": [
{
"term": {
"accessoires.name.raw": "Climate Control"
}
}
]
}
},
"path": "opties"
},
{
"filter": {
"bool": {
"must": [
{
"term": {
"vestiging.name_dtc.raw": "Location X"
}
}
]
}
},
"path": "vestiging"
}
]
},
"query": {
"filtered": {
"filter": {
"term": {
"key": "33e75ff09dd6"
}
},
"query": []
}
}
},
"index": "ocm",
"type": "voertuig"
}
第一个查询有效,第二个查询引发错误:
嵌套:QueryParsingException [[ocm] [nested]过滤器不支持[null]];
如何创建与多个路径中的字段匹配的过滤器?
答案 0 :(得分:2)
这个怎么样:
{
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : [
{
"nested": {
"filter": {
"term": {
"accessoires.name.raw": "Climate Control"
}
},
"path": "accessoires"
}
},
{
"nested": {
"filter": {
"term": {
"vestiging.name_dtc.raw": "Location X"
}
},
"path": "vestiging"
}
},
{
"term": {
"key": "33e75ff09dd6"
}
}
]
}
}
}
}
}
我认为您遇到的问题是嵌套过滤器使用不当的结果,尽管从异常消息中获取确切的问题有点困难。基本上,如果您想要组合两个嵌套过滤器,则必须使用bool
或and
过滤器对它们进行分组。
为了更小的帖子,我已经减少了很多查询。我没有post_filter
,因为您的示例中没有任何聚合。我将内部bool过滤器替换为它们所拥有的单个术语过滤器,并在该附加键(term
)过滤器上进行了标记。但是您可以继续使用您的查询结构并根据需要展开它,主要修复程序解决了两个嵌套过滤器的组合方式。