背景: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成立。
修改代码如下:文章来源:https://www.toymoban.com/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对象里面,嵌套一层。解决问题。文章来源地址https://www.toymoban.com/news/detail-609640.html
到了这里,关于ES中同时使用should和must导致只有must生效解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!