以前在使用es must和should混合使用的時候,發現should不起做用了。java
es版本5.6數據庫
https://segmentfault.com/q/1010000008089977?_ea=1544390segmentfault
https://blog.csdn.net/u012116196/article/details/51789253elasticsearch
例如在a=1且b=2的數據中,找出c=1或者d=2的數據
{"query": { "bool": { "must": [ {"match": { "a": "1", "b": "2" }} ], "should": [ {"match": { "c": "1" },
{"match": {
"d": "2"
}}
]
}}}
這樣寫的時候should是沒有用的,這是新手可能犯的錯誤之一。
在編寫查詢條件的時候,不能用口頭上的邏輯進行編寫,而是要換成數學邏輯才能進行執行(數據庫同理)。
如上例,數學邏輯應該是 (a==1&&b==2&&c==1)||(a==1&&b==2&&d==2)(java and c語言版),這樣的結構去查詢。
{"query": { "bool": { "should": [ {"match": { "a": "1", "b": "2", "c": "1" }} ], "should": [ {"match": { "a": "1", "b": "2", "d": "2" }} ] }}}
QueryBuilder query = QueryBuilders.boolQuery() .should(QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery("a", 1)) .filter(QueryBuilders.termQuery("b", 2)) .filter(QueryBuilders.termQuery("c", 1)) .should(QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery("a", 1)) .filter(QueryBuilders.termQuery("b", 2)) .filter(QueryBuilders.termQuery("d", 2));