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

移动CM101s_MV100_EMMC_M8233_强刷后全分区线刷固件包

Real-Time Rendering 4th related resource arrangement (no credit required)

gcc7.5.0编译ceres-solver报错‘is_trivially_default_constructible’ is not a member of ‘std’

备战9月,美团50道软件测试经典面试题及答案汇总

redis

不需要服务器,教你仅用30行代码搞定实时健康码识别

功率放大器的设计要点

面了三十个人,说说真实感受

seaborn

湖北移动HG680-LV_S905L3B_线刷固件包
随机推荐
MySQL 性能调优和优化技巧
地理标志农产品需双重保护
EMQ云端与局域网实现桥接功能
Go语言gin框架返回json格式里,怎么把某个int属性转成string返回?
荐书 | 《大脑的奥秘:人人要懂的脑科学》:大脑里面有什么
Jenkins 如何玩转接口自动化测试?
ping不通百度
DMS 有接口获取每个实例下的数据库列表吗
Real-Time Rendering 4th related resource arrangement (no credit required)
5 基本引用类型
HCIP笔记(8)
黑龙江移动新魔百盒M411A_2+8_S905L3A_线刷固件包
闭包及闭包的使用
什么是会话劫持攻击以及如何防止会话劫持
显示和设置系统日期时间的date命令示例
UWP 转换 IBuffer 和其他类型
leetcode 48. Rotate Image 旋转图像(Medium)
Analysis of Http-Sumggling Cache Vulnerability
软考 --- 软件工程(2)软件开发方法
【IDEA】idea配置