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