当前位置: 首页 > 知识库问答 >
问题:

多组嵌套路径上的Elasticsearch过滤器

史智志
2023-03-14

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

孟沛
2023-03-14

那么这个呢:

{
  "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筛选器对它们进行分组。

为了更小的帖子,我已经减少了相当多的查询。我没有post_filter,因为您的示例中没有任何聚合。我将内部bool筛选器替换为它们所具有的单个术语筛选器,并将其标记在附加键(term)筛选器上。但是,您可以继续使用查询结构,并根据需要展开它,主修复解决了两个嵌套筛选器是如何放在一起的。

 类似资料:
  • 问题内容: 我有一个这样的文档模型: 一个客户可以有0个,1个或多个订单,一个订单可以有0个,1个或多个orderLines (这是我为这个问题创建的模型,因为我认为这是每个人都可以理解的数据,因此,如果发现任何错误,请让我知道,但不要让他们分散我的实际问题) 我想使用NEST创建一个查询,该查询选择一个(或所有)具有customer.id特定值的客户,但前提是他们至少具有一个具有特定articl

  • 问题内容: TL; DR -我该如何检查是否 之一的 和 所有的 嵌套数组满足规定的标准是什么? 我有一个。每个对象都有一个嵌套对象数组,这些对象本身都有一个嵌套对象列表。我需要对所有文档中 至少一个嵌套对象匹配的文档执行过滤器。当我说的比赛,我的意思是 所有 的嵌套对象的对象以某种方式相匹配。这是一个示例映射,以供参考; 如果文档没有/ 对象,则认为是匹配的。但是,更糟糕的是,内部对象需要考虑以

  • 问题内容: 我有带有嵌套字段的文档,如下所示: 嵌套字段的映射如下所示: 在切换到elasticsearch 2之前,我有一个带有aggs的查询,该查询计算了没有结果的文档。这是查询的聚合部分: 现在我切换到elasticserach 2,它只计算所有文档。我已经尝试过其他操作,例如计算所有文档和计算结果,以便可以减去结果,但是 总是0 如何正确过滤/计数嵌套字段? 问题答案: 如果您要计算产生结

  • 问题内容: 我一直在尝试搜索包含嵌套字段的文档。我创建了这样的嵌套映射: 我的搜索如下所示: 但是我收到此错误消息: 编辑 我仍然收到此错误。我正在通过Java执行此操作,因此这是我要创建的文档: 像这样创建索引: 我认为我可能对文档编制了错误的索引。 问题答案: TLDR:输入您的嵌套类型。 假设我们有一个普通类型,并且嵌套了另一个类型: 该行是分配给的嵌套查询所必需的,如下所示: 该行似乎仅在

  • 我有一个电影模型和一个搜索页面,有一个电影流派方面。可以在搜索页面上的每个方面附近选择一个复选框。我将选中的方面术语列表传递给控制器,我希望筛选电影集合只包括那些用复选框选择了类型的电影。 我的带有索引和搜索定义的模型是: 我不确定这部分应该怎么改写: 稍后,我将把流派列表或流派ID作为参数传递,我需要对它们进行筛选。 它过滤到有‘类型1'或’类型2'或‘类型3'的电影,我需要这些类型和逻辑。 我

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要