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