[英]ElasticSearch: Multi-level nested query "AND" syntax
我有一个类似于 elasticsearch doc 多级嵌套查询示例中显示的示例索引的索引: https://www.elastic.co/guide/en/elasticsearch/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"
}
]
}
}
我需要能够找到 driver.vehicle.make 匹配两个值的文档,即同时拥有车辆制造“Powell Motors”和“Miller-meteor”的司机应该匹配 McQueen 而不是 Hudson。 我尝试了类似于文档示例的 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" } }
]
}
}
}
}
}
}
}
将“必须”更改为“应该”会返回两个文档。 我似乎找不到在同一个文档中查询车辆数组的多个值匹配的查询。
上面的查询返回 0 个文档,因为您的示例中没有单个文档(在driver.vehicle
内)的driver.vehicle.make
值为“Powell Motors”和“Miller-meteor”。
注意:这里的单个文档是指driver.vehicle
中的每个单独的文档(或对象)。
因此,当您将must
子句更改为should
子句时,它会返回那些具有driver.vehicle.make
值为"Powell Motors" OR "Miller-meteor"
的文档(在本例中为文档)。 must
用作逻辑 AND 运算符,并且should
用作逻辑 OR 运算符。
根据您的要求,我相信您想要那些拥有车辆的司机制造“Powell Motors”或“Miller-meteor”的文件应该匹配 McQueen 而不是 Hudson 。
在这种情况下,您需要将嵌套查询与普通查询结合起来,这可以使用 bool 查询来完成。
您修改后的查询将是
{
"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"
}
]
}
}
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.