Elasticsearch在多个嵌套路径上进行过滤

时间:2015-11-04 12:12:11

标签: elasticsearch nosql

我有一个带有嵌套数据的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]];

如何创建与多个路径中的字段匹配的过滤器?

1 个答案:

答案 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"
              }
            }
          ]
        }
      }
    }
  }
}

我认为您遇到的问题是嵌套过滤器使用不当的结果,尽管从异常消息中获取确切的问题有点困难。基本上,如果您想要组合两个嵌套过滤器,则必须使用booland过滤器对它们进行分组。

为了更小的帖子,我已经减少了很多查询。我没有post_filter,因为您的示例中没有任何聚合。我将内部bool过滤器替换为它们所拥有的单个术语过滤器,并在该附加键(term)过滤器上进行了标记。但是您可以继续使用您的查询结构并根据需要展开它,主要修复程序解决了两个嵌套过滤器的组合方式。