当前位置:网站首页>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对象里面,嵌套一层。解决问题。
边栏推荐
猜你喜欢

会话劫持安全攻击

屏幕分辨率兼容性

博云入选Gartner中国云原生领域代表性厂商

【Pick-in】Advertising-information flow cross-domain CTR estimation (to be updated)

Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?

电气成套设备行业如何借助ERP系统,解决企业管理难题?

历史上的今天:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS

Jenkins 如何玩转接口自动化测试?

codeforces:808D. Array Division【二分 + 找规律】

平稳发展 | 西欧地区手游玩家的数据和洞察
随机推荐
【笔试题】-【日常记录】
移动CM101s_MV100_EMMC_M8233_强刷后全分区线刷固件包
8年软件测试感悟,送给刚入测试行业的小伙伴
\/ PN的综合实验
C#命令行解析工具
张乐:研发效能的黄金三角及需求与敏捷协作领域的实践|直播回顾
代码重构:面向单元测试
移动中兴ZXV10 B860AV2.1-A_S905L2_MT7668_线刷固件包
LeetCode·84.柱状图中最大的矩形·单调递增栈
浙江移动咪咕MGV2000-K4_ZJ_S905l2_7661_线刷固件包
7 月浏览器市场份额:Edge 全球第二、360 安全浏览器中国第二
JVM Tuning-GC Fundamentals and Tuning Key Analysis
HCIP笔记(8)
Difference between GET and POST requests
软考 --- 软件工程(2)软件开发方法
C# 写系统日志
pygame的freetype模块
花了半个月,终于把一线大厂高频面试题做成合集了
shell中当basename和dirname无法满足你的需求时你一定要想到的命令
黑龙江移动新魔百盒M411A_2+8_S905L3A_线刷固件包