带有必须和必须不具有相同字段的Elasticsearch嵌套查询

时间:2020-07-10 17:48:37

标签: elasticsearch

样本数据

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匹配,但与其他任何排名都不匹配。

2 个答案:

答案 0 :(得分:0)

我最终弄清楚了正确的语法以获取所需的内容。如果对其他人有帮助,这对我有用:

{
  "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
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

答案 1 :(得分:0)

按如下所示修改查询:

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_not子句中推送must的代码一样。

那样,它将帮助您获得所需的解决方案。

希望有帮助!