背景:es嵌套查詢,條件a等于某一個值且條件b等于某兩個值甚至更多。
第一步:單獨條件b采用should
匹配多個值,可以查到預期的結果,代碼如下:
BoolQueryBuilder builder = QueryBuilders.boolQuery();
for (Map<String, String> sitfTrack : sitfTracks) {
builder.should(QueryBuilders.matchQuery("sourceCode",sitfTrack.get("interfaceCode")));
}
第二步:單獨條件a采用must匹配單個值,也可以查到預期的結果,代碼如下:
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.must(QueryBuilders.termQuery("batchNum.keyword", traceLog.getBatchNum()));
第三步:合并起來查詢,a和b條件同時啟用,代碼如下:
BoolQueryBuilder builder = QueryBuilders.boolQuery();
for (Map<String, String> sitfTrack : sitfTracks) {
builder.should(QueryBuilders.matchQuery("sourceCode",sitfTrack.get("interfaceCode")));
}
builder.must(QueryBuilders.termQuery("batchNum.keyword", traceLog.getBatchNum()));
然而結果并未按照預期輸出,得到的是a和b的并集,我們想要的是交集。
分析原理:和mysql對比,must類似于and語句,should相當于or語句,那么上面的代碼代表的意思是a成立或者b成立,我們要的是a成立且b成立。
修改代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-609640.html
BoolQueryBuilder bu= QueryBuilders.boolQuery();
BoolQueryBuilder builder = QueryBuilders.boolQuery();
for (Map<String, String> sitfTrack : sitfTracks) {
builder.should(QueryBuilders.matchQuery("sourceCode",sitfTrack.get("interfaceCode")));
}
//注意這里
bu.must(builder);
bu.must(QueryBuilders.termQuery("batchNum.keyword", traceLog.getBatchNum()));
可以理解為:每一個獨立的查詢條件都是一個BoolQueryBuilder對象,把b條件獨立出來,然后再匯總到一個集體的BoolQueryBuilder對象里面,嵌套一層。解決問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-609640.html
到了這里,關于ES中同時使用should和must導致只有must生效解決方案的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!