先看看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