簡體   English   中英

ElasticSearch:多級嵌套查詢“AND”語法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM