ElasticSearch---es用should表示or的邏輯


should

在使用es時,如果需要用到or邏輯,可以使用should。

minimum_should_match

should,可以配合 minimum_should_match 使用。
minimum_should_match是最低匹配度, minimum_should_match為1, 表示should條件中,至少有一項符合。

注意,should和must一起用,should會失效,加上minimum_should_match 就可以了。

示例1

比如, a && (b or c) ,可以如下所示:

{
  "bool" : {
    "filter" : [
      {
        "terms" : {
          "查詢條件a" : [
            "a值"
          ],
          "boost" : 1.0
        }
      }
    ],
    "should" : [
      {
        "terms" : {
          "查詢條件b" : [
            "b值"
          ],
          "boost" : 1.0
        }
      },
      {
        "terms" : {
          "查詢條件c" : [
            "c值"
          ],
          "boost" : 1.0
        }
      }
    ],
    "disable_coord" : false,
    "adjust_pure_negative" : true,
    "minimum_should_match" : "1",
    "boost" : 1.0
  }
}

對應的java代碼如下:

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.filter(QueryBuilders.termsQuery("查詢條件a", "a值"));
        boolQuery.should(QueryBuilders.termsQuery("查詢條件b", "b值"))
                .should(QueryBuilders.termsQuery("查詢條件c", "c值"))
                .minimumShouldMatch(1);

示例2

比如, a && ((b && c) or (d && e)) ,可以如下所示:

{
  "bool" : {
    "filter" : [
      {
        "terms" : {
          "查詢條件a" : [
            "值a"
          ],
          "boost" : 1.0
        }
      }
    ],
    "should" : [
      {
        "bool" : {
          "must" : [
            {
              "terms" : {
                "查詢條件b" : [
                  "值b"
                ],
                "boost" : 1.0
              }
            },
            {
              "term" : {
                "查詢條件c" : {
                  "value" : "值c",
                  "boost" : 1.0
                }
              }
            }
          ],
          "disable_coord" : false,
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      },
      {
        "bool" : {
          "must" : [
            {
              "terms" : {
                "查詢條件d" : [
                  "值d"
                ],
                "boost" : 1.0
              }
            },
            {
              "term" : {
                "查詢條件e" : {
                  "value" : "值e",
                  "boost" : 1.0
                }
              }
            }
          ],
          "disable_coord" : false,
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      }
    ],
    "disable_coord" : false,
    "adjust_pure_negative" : true,
    "minimum_should_match" : "1",
    "boost" : 1.0
  }
}

對應的java代碼如下:

    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    boolQuery.filter(QueryBuilders.termsQuery("查詢條件a", "值a"));
    boolQuery.should(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("查詢條件b", "值b"))
            .must(QueryBuilders.termQuery("查詢條件c", "值c")))
            .should(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("查詢條件d", "值d"))
                    .must(QueryBuilders.termQuery("查詢條件e", "值e")))
            .minimumShouldMatch(1);
    System.out.println(boolQuery);

小技巧: 直接寫dsl,會比較麻煩,用代碼去把dsl打印出來,會方便很多。

參考資料

http://events.jianshu.io/p/84789dd89dcf
https://blog.csdn.net/qq_31748587/article/details/101449613


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM