【问题标题】:ElasticSearch Query : Query must match at least one of multiple valuesElasticSearch 查询:查询必须至少匹配多个值之一
【发布时间】:2021-12-08 23:46:13
【问题描述】:

我需要 ElasticSearch 查询的帮助,我需要结合应该和必须,但我不知道该怎么做:

这是我想做的查询示例:

    ap_code= ["ta", "All"] (OR condition)

    AND

    ra_code= ["ph", "All"] (OR condition)

    AND

    city = ["London"] 

这是查询,但它从 ES 获取所有结果

"bool" : {
    "must" : [
      {
        "match_phrase" : {
          "city" : {
            "query" : "London",
            "slop" : 0,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      }
    ],
    "should" : [
      {
        "match_phrase" : {
          "ra_code" : {
            "query" : "ph",
            "slop" : 0,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      },
      {
        "match_phrase" : {
          "ra_code" : {
            "query" : "All",
            "slop" : 0,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      },
      {
        "match_phrase" : {
          "ap_code" : {
            "query" : "All",
            "slop" : 0,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      },
      {
        "match_phrase" : {
          "ap_code" : {
            "query" : "ta",
            "slop" : 0,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

我正在使用 Java API 创建查询 (JDK 11)

有什么帮助吗? 提前致谢

【问题讨论】:

    标签: java elasticsearch elasticsearch-5


    【解决方案1】:

    您可以在 must 子句中使用 should 查询,如下所示。

    {
      "query": {
        "bool": {
          "must": [
            {
              "match_phrase": {
                "city": {
                  "query": "London",
                  "slop": 0,
                  "zero_terms_query": "NONE",
                  "boost": 1
                }
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "ra_code": {
                        "query": "ph",
                        "slop": 0,
                        "zero_terms_query": "NONE",
                        "boost": 1
                      }
                    }
                  },
                  {
                    "match_phrase": {
                      "ra_code": {
                        "query": "All",
                        "slop": 0,
                        "zero_terms_query": "NONE",
                        "boost": 1
                      }
                    }
                  }
                ],
                "minimum_should_match": 1
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match_phrase": {
                      "ap_code": {
                        "query": "ta",
                        "slop": 0,
                        "zero_terms_query": "NONE",
                        "boost": 1
                      }
                    }
                  },
                  {
                    "match_phrase": {
                      "ap_code": {
                        "query": "All",
                        "slop": 0,
                        "zero_terms_query": "NONE",
                        "boost": 1
                      }
                    }
                  }
                ],
                "minimum_should_match": 1
              }
            }
          ]
        }
      }
    }
    

    对于 Java api,您可以尝试如下方式

    BoolQueryBuilder first = QueryBuilders.boolQuery()
        .should(QueryBuilders.matchQuery(field1, value1))
        .should(QueryBuilders.matchQuery(field2, value2));
    
    BoolQueryBuilder second= QueryBuilders.boolQuery()
        .should(QueryBuilders.matchQuery(field1, value1))
        .should(QueryBuilders.matchQuery(field2, value2));
    
    
    BoolQueryBuilder filter = new BoolQueryBuilder()
        .must(first)
        .must(second);
    
    

    【讨论】:

    • 您好,感谢您的回答。我试过这样做(嵌入必须和应该),但我不知道如何使用 Java API。有什么想法吗?
    • @Lina 我添加了一个示例
    • 非常感谢!!正是我想要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多