簡體   English   中英

Elasticsearch 嵌套查詢,必須和不能具有相同字段

[英]Elasticsearch Nested Query with Must and Must Not with same fields

樣本數據

poll_A:
{
  popular: [
    { domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 1 },
    { domains: [ "google.com", "amazon.com" ], rank: 2 },
  ]
}

poll_B:
{
  popular: [
    { domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 1 },
    { domains: [ "google.com", "etsy.com", "amazon.com" ], rank: 2 },
  ]
}

我正在嘗試創建一個查詢,該查詢將檢查域是否僅存在於排名 1。以下查詢是我開始的,因為它看起來是正確的。 但是,無論我要檢查哪個等級,匹配查詢似乎都會檢查嵌套字段的每個實例。

{
  "query": {
    "nested": {
      "path": "popular",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "popular.domains": "etsy.com"
              }
            },
            {
              "match": {
                "popular.rank": 1
              }
            }
          ],
          "must_not": [
            {
              "match": {
                "popular.domains": "etsy.com"
              }
            },
            {
              "range": {
                "popular.rank": {
                  "gte": 2
                }
              }
            }
          ]
        }
      }
    }
  }
}

本質上,我想檢查該域是否與排名 1 匹配,但與任何其他排名不匹配。

我最終找出了正確的語法來獲得我需要的東西。 如果它可以幫助其他人,這對我有用:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "popular",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "popular.Domains": "etsy.com"
                    }
                  },
                  {
                    "match": {
                      "popular.Rank": 1
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": [
        {
          "nested": {
            "path": "popular",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "popular.Domains": "etsy.com"
                    }
                  },
                  {
                    "range": {
                      "popular.Rank": {
                        "gte": 2
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

修改您的查詢如下:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "popular",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "popular.domains": "etsy.com"
                    }
                  },
                  {
                    "match": {
                      "popular.rank": 1
                    }
                  }
                ]
              }
            }
          }
        }
      ],
      "must_not": [
        {
          "nested": {
            "path": "popular",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "popular.domains": "etsy.com"
                    }
                  },
                  {
                    "range": {
                      "popular.rank" :{
                        "gte": 2
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

請注意結構,我如何在外部must子句中推送must_not的代碼。

這樣,它將幫助您獲得所需的解決方案。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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