es bool多條件組合查詢must should同時使用的問題


先看看bool的語法

{
    "query": {
        "bool": {
            "must": [{},...],
            "should": [{},...],...
        }
    }
}

先保存如下數據

 

需求:查詢分數是70或80的男生

用人的正常邏輯思維,會覺得應該這么寫 sex==男&&(score==70||socre==80),最終理想值是得到李四趙六、

{
   "query": {
      "bool": {
         "must": [
            {"term": {"sex": {"value": "男"}}}
         ],
         "should": [
            {"term": { "score": {"value": "70"}}},
            {"term": {"score": {"value": "80"}}}
         ]
      }
   }
}

執行后發現should失效了,張三、李四、趙六都被查詢出來了

有兩種寫法可以解決should失效的問題

第一種:(sex==男&&score==70)||(sex==男&&socre==80)

{
   "query": {
      "bool": {
         "should": [
            {
               "bool": {
                  "must": [
                     {"term": {"sex": "男"}},
                     {"term": {"score": "70"}}
                  ]
               }
            },
            {
               "bool": {
                  "must": [
                     {"term": {"sex": "男"}},
                     {"term": {"score": "80"}}
                  ]
               }
            }
         ]
      }
   }
}

第二種:在must中再嵌套一層bool來做should過濾

{
   "query": {
      "bool": {
         "must": [
            {"term": {"sex": {"value": "男"}}},
            {
                "bool": {
                  "should": [
                     {"term": {"score": {"value": "70"}}},
                     {"term": {"score": {"value": "80"}}}
                  ]
               }
            }
         ]
      }
   }
}

經過查閱發現:

當使用should查詢時,如果包含了must或者filter查詢,那么should的查詢語句就不是或者的意思了,而是有或者沒有都行的含義

那么第一種寫法的含義就是:

性別必須為男,但是分數可以是70,也可以是80,也可以兩者都不是。

如果沒有filter和must查詢的話,那么必須滿足一個should中的條件。

除了上面提到的解決方案,還有一種解決方案如下:

使用minimum_should_match,至少匹配一項should子句

 

 

參考文章:

https://blog.csdn.net/qq_31748587/article/details/101449613

https://blog.csdn.net/JineD/article/details/111997205


免責聲明!

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



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