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

ElasticSearch:多级嵌套查询“AND”语法

万俟震博
2023-03-14

我得到了一个类似于elasticsearch文档多级嵌套查询示例中显示的示例索引的索引:https://www . elastic . co/guide/en/elastic search/reference/current/query-DSL-nested-query . html # multi-level-nested-query-ex

给定这些示例文档:

{
  "driver" : {
        "last_name" : "McQueen",
        "vehicle" : [
            {
                "make" : "Powell Motors",
                "model" : "Canyonero"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }
}

{
  "driver" : {
        "last_name" : "Hudson",
        "vehicle" : [
            {
                "make" : "Mifune",
                "model" : "Mach Five"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }
}

我需要能够找到司机的文件。make匹配两个值,即同时拥有“Powell Motors”和“Miller流星”两款车的驾驶员应该匹配McQueen,而不是Hudson。我尝试了一个类似于doc示例的make和model查询的查询,但它返回0个文档:

{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                { "match": { "driver.vehicle.make": "Powell Motors" } },
                { "match": { "driver.vehicle.make": "Miller-Meteor" } }
              ]
            }
          }
        }
      }
    }
  }
}

将“必须”改为“应该”会返回两个文档。我似乎找不到在同一个文档中查询vehicle数组的多个值匹配的查询。

共有1个答案

芮岳
2023-03-14

上述查询返回0个文档,因为在您的示例中,没有一个文档(在< code>driver.vehicle中)的< code>driver.vehicle.make值为“Powell Motors”和“Miller-meteor”。

注意:此处的单个文档是指驾驶员车辆内的每个单独文档(或对象)。

因此,当您将必须子句更改为子句时,它会返回那些具有driver.vehicle.make值的文档(在本例中都是文档),这些文档具有“鲍威尔汽车”或“米勒流星”必须作为逻辑 AND 运算符工作,并且应该作为逻辑 OR 运算符工作。

根据您的要求,我相信您想要那些拥有车辆的驾驶员制造“鲍威尔汽车”或“米勒流星”的文件应该与麦昆匹配,而不是哈德逊。

在这种情况下,您需要将嵌套查询与普通查询结合起来,这可以使用布尔查询来完成。

修改后的查询将是

{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "driver.last_name": "McQueen"
              }
            },
            {
              "nested": {
                "path": "driver.vehicle",
                "query": {
                  "bool": {
                    "should": [
                      {
                        "match": {
                          "driver.vehicle.make": "Powell Motors"
                        }
                      },
                      {
                        "match": {
                          "driver.vehicle.make": "Miller-Meteor"
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

搜索结果将会是

 "hits" : [
      {
        "_index" : "soidx1",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 3.105637,
        "_source" : {
          "driver" : {
            "last_name" : "McQueen",
            "vehicle" : [
              {
                "make" : "Powell Motors",
                "model" : "Canyonero"
              },
              {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
              }
            ]
          }
        }
      }
    ]
 类似资料:
  • 我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?

  • 问题内容: 我正在尝试使用query_string编写查询以检索嵌套对象的数据查询。 我想做的查询的一个例子是: 其中“ a”是嵌套对象,“ id”是“ a”的字段。 我知道我可以使用嵌套查询成功地执行此任务,编写如下查询: 但是,我想避免这种情况。我不想自己弄清楚用户正在搜索嵌套字段并修改查询。我尝试使用“ fields”参数,但它似乎不适用于嵌套对象。 是否可以使用“ query_string

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他

  • 我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 我正在通过jHipster使用Spring Data Elasticsearch支持,并试图更多地了解如何使用搜索来扩展数据库中的一些新关系。 我有了一个新的嵌套关系,它有自己的索引: 我想将结果筛选到特定用户“friend1.id”,并在嵌套文档上搜索匹配的详细信息? 但这似乎没有返回任何结果?

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助