当前位置:网站首页>ES中同时使用should和must导致只有must生效解决方案
ES中同时使用should和must导致只有must生效解决方案
2022-08-04 16:31:00 【RT_0114】
背景: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成立。
修改代码如下:
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对象里面,嵌套一层。解决问题。
边栏推荐
猜你喜欢
移动魔百盒CM201-1_CW_S905L2_MT7668_线刷固件包
Real-Time Rendering 4th related resource arrangement (no credit required)
工龄10年的测试员从大厂“裸辞”后...
备战9月,美团50道软件测试经典面试题及答案汇总
测试零基础如何进入大厂?一场面试教会你(附面试题解析)
Minecraft 服务器安装Forge 并添加Mod
Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?
8年软件测试感悟,送给刚入测试行业的小伙伴
leetcode:743. 网络延迟时间【单源最短路 + dijkstra模板】
推荐 7 月份 yyds 的开源项目
随机推荐
Win10 无线网卡驱动感叹号,显示错误代码56
C# 写系统日志
花了半个月,终于把一线大厂高频面试题做成合集了
测试开发必备技能-Jmeter二次开发
LeetCode·85.最大矩形·单调栈
8年软件测试感悟,送给刚入测试行业的小伙伴
【Pick-in】Advertising-information flow cross-domain CTR estimation (to be updated)
不需要服务器,教你仅用30行代码搞定实时健康码识别
开源一夏 | 请你谈谈网站是如何进行访问的?【web领域面试题】
云存储硬核技术内幕——(8) 只缘身在此山中
浙江数码代工M301H 免拆通刷_卡刷固件包(语音OK)
移动百事通BesTV_R3300-L_S905L_8189_线刷固件包
荐书 | 《大脑的奥秘:人人要懂的脑科学》:大脑里面有什么
越来越火的图数据库到底能做什么?
dot net double 数组转 float 数组
从正负样本解耦看对比学习为何需要large batch size训练Ddcoupled Contrastive learning (DCT)
不需要服务器,教你仅用30行代码搞定实时健康码识别
codeforces:808D. Array Division【二分 + 找规律】
越来越火的图数据库到底能做什么?
SAP HANA Schemas 和 HDI Containers