首页 > 解决方案 > 具有多个 and and or 条件的 Elasticsearch 嵌套查询

问题描述

我正在尝试在 elasticsearch 中生成嵌套mustshould查询以模仿以下条件:

(  (brandsvisited ilike '%adidas%' or   brandsvisited ilike '%skechers%' ) or( placecategory ilike '%Pizza Restaurant Visitors%' or   placecategory ilike '%Grocery Store Visitors%'  ) and( gender='Male'  )  ) and polygonid = '1465'

我在 elasticsearch 中创建了以下查询。

"query": {
      "bool": {
          "must": [
              {"term": {"polygonid": "1465"}},
              {"term": {"gender": "Male"}},
              {
                  "bool": {
                      "should": [
                          {"term": {"brandsvisited": "adidas"}},
                          {"term": {"brandsvisited": "skechers"}}
                      ],"minimum_should_match": 1
                  }
              },
              {
                  "bool": {
                      "should": [
                          {"term": {"placecategory": "Pizza Restaurant Visitors"}},
                          {"term": {"placecategory": "Grocery Store Visitors"}}
                      ],"minimum_should_match": 1
                  }
              }
          ]
      }
  }

上述查询返回零个结果。但是,如果我删除最后一个布尔值应该查询,它会返回结果。不知道我哪里出错了。

标签: elasticsearchelasticsearch-query

解决方案


假设该placecategory字段是文本类型。您需要将其替换为placecategory.keyword字段(如果您尚未定义任何显式索引映射)

术语查询返回在提供的字段中包含确切术语的文档。如果您尚未定义任何显式索引映射,则需要将 .keyword 添加到该字段。这使用关键字分析器而不是标准分析器。

修改您的查询,如下所示

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "polygonid": "1465"
          }
        },
        {
          "term": {
            "gender": "Male"
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "brandsvisited": "adidas"
                }
              },
              {
                "term": {
                  "brandsvisited": "skechers"
                }
              }
            ],
            "minimum_should_match": 1
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "placecategory.keyword": "Pizza Restaurant Visitors"
                }
              },
              {
                "term": {
                  "placecategory.keyword": "Grocery Store Visitors"
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  }
}

如果要在中搜索确切的术语,placecategory则可以使用带有should子句的术语查询或术语查询,否则,如果要匹配placecategory字段中的短语,则可以使用match_phrase查询


推荐阅读