Elasticsearch嵌套查询must和mustNot

article/2025/9/20 23:00:54

场景:在bug关联固件的时候将bug的数据放到固件的数据下,可以根据固件数据下是否包含bug数据查询出已关联和未关联的数据。

ES文档结构

目录

1.must查询此bug关联的固件

java代码

2.mustNot查询此bug未关联的固件

java代码

3.劫后余生       

4.闲来无事must_not跟must下的多条件关系不一样

4.1 es查询

4.2 java代码



1.must查询此bug关联的固件

{"query":{"nested":{"path":"s25_kernel_check","query":{"bool":{"must":[{"match":{"s25_kernel_check.cve_id":"value"}},{"match":{"s25_kernel_check.exploit-db":"value"}}]}}}}
}

同时满足must下的条件才可以被返回

java代码

BoolQueryBuilder must = QueryBuilders.boolQuery();
if (cvesById.getCveId()!=null){must.must(QueryBuilders.matchQuery("s25_kernel_check.cve_id", cvesById.getCveId()));
}
if (cvesById.getExploitDb()!=null){must.must(QueryBuilders.matchQuery("s25_kernel_check.exploit-db", cvesById.getExploitDb()));
}HashMap<String, Object> map2 = new HashMap<>();
NestedQueryBuilder s25_kernel_check = QueryBuilders.nestedQuery("s25_kernel_check", must,ScoreMode.Max);
SearchQuery queryBuilder = new NativeSearchQueryBuilder().withQuery(s25_kernel_check).withFields("firmware_id").build();
AggregatedPage<Cvesdd> page = template.queryForPage(queryBuilder, Cvesdd.class, new SearchResultMapper() {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {map2.put("total", searchResponse.getHits().totalHits);List<T> list = new ArrayList<>();return new AggregatedPageImpl<T>(list);}
});
Integer total= new Integer(String.valueOf((Long) map2.get("total")));
if (total == 0){total = 10;
}
NestedQueryBuilder new_s25_kernel_check = QueryBuilders.nestedQuery("s25_kernel_check", must,ScoreMode.Max);
SearchQuery new_queryBuilder = new NativeSearchQueryBuilder().withQuery(new_s25_kernel_check).withFields("firmware_id").withPageable(PageRequest.of(0,total)).build();
List<Cvesdd> list = template.queryForList(new_queryBuilder, Cvesdd.class);

2.mustNot查询此bug未关联的固件

{"size": 200, "query": {"bool": {"must_not": [{"nested": {"path": "s25_kernel_check","query": {"bool": {"must": [{"match": {"s25_kernel_check.cve_id": "value"}},{"match": {"s25_kernel_check.exploit-db": "value"}}]}}}}]}}
}

排除同时满足must下条件的数据并返回

java代码

HashMap<String, Object> totalMap = new HashMap<>();
BoolQueryBuilder must = QueryBuilders.boolQuery();
if (cvesById.getCveId()!=null){must.must(QueryBuilders.matchQuery("s25_kernel_check.cve_id", cvesById.getCveId()));
}
if (cvesById.getExploitDb()!=null){must.must(QueryBuilders.matchQuery("s25_kernel_check.exploit-db", cvesById.getExploitDb()));
}
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery("s25_kernel_check", must,ScoreMode.Max);
BoolQueryBuilder newBool = QueryBuilders.boolQuery();
newBool.mustNot(nestedQuery);
SearchQuery queryBuilder = new NativeSearchQueryBuilder().withQuery(newBool).withFields("firmware_id").build();
AggregatedPage<Cvesdd> page = template.queryForPage(queryBuilder, Cvesdd.class, new SearchResultMapper() {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {totalMap.put("total", searchResponse.getHits().totalHits);List<T> list = new ArrayList<>();return new AggregatedPageImpl<T>(list);}
});
Integer total= new Integer(String.valueOf((Long) totalMap.get("total")));
SearchQuery new_queryBuilder = new NativeSearchQueryBuilder().withQuery(newBool).withFields("firmware_id").withPageable(PageRequest.of(0,total)).build();
List<Cvesdd> list = template.queryForList(new_queryBuilder, Cvesdd.class);

查询语句跟代码的对应关系


3.劫后余生       

        OK,上面是满足了我想要的效果,但是发现在关联后,在es中再增加一条不同任务但是固件已经被某条bug关联过的数据,就会发现某条bug的未关联固件和已关联固件都会出现这个固件,原因是es中其实是存放的任务跟固件的关联关系,又因为业务关系,会存在多条相同固件但是不同任务的数据,关联之后创建的新任务已有固件数据,其中并未包含某条bug的数据,所以才会导致这样,那么ok,在查询未关联的逻辑之前,先查询一下已经关联的数据,不管它在哪个任务,只要所有的固件数据,有一条满足包含此条bug数据,那么我们就认为此条固件已经关联了这个bug了

4.闲来无事must_not跟must下的多条件关系不一样

        还尝试了排除嵌套查询满足或者id存在集合中的数据,gpt说这俩是and的关系,但是怎么测都是or的关系,现在es有三条id等于137的数据,其中有两条是满足嵌套查询的条件,如果是and那么应该是给我返回只是id等于137不满足嵌套查询的数据,但是并没有。。

        但是如果将must_not改成must下面的这个两个就成了and的关系,就会返回同时满足这两个条件的数据

        就很奇怪!离谱它妈给离谱开门,离谱到家了~

        那么我们来看看gpt对疑问的回答

4.1 es查询

{"size": 200, "query": {"bool": {"must_not": [{"terms": {"firmware_id": [137]}},{"nested": {"path": "s25_kernel_check","query": {"bool": {"must": [{"match": {"s25_kernel_check.cve_id": "CVE-2010-3848,CVE-2010-3850,CVE-2010-4073"}},{"match": {"s25_kernel_check.exploit-db": "17787"}}]}}}}]}}
}

4.2 java代码


 最上面所提到的关联操作

//查询es中要关联的固件数据
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchQuery("firmware_id",ids[i]));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery)//指定索引.withIndices("information_result")//指定type.withTypes("fulldata").build();
List<?> results = template.query(searchQuery, response -> {List<Object> list = new ArrayList<>();for (SearchHit hit : response.getHits()) {Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id",hit.getId());list.add(sourceAsMap);}return list;
});//构建批量插入的集合
List<IndexQuery> queries = new ArrayList<>();
for (int i1 = 0; i1 < results.size(); i1++) {Map oldData = (HashMap) results.get(i1);ArrayList s25_kernel_check1 =new ArrayList();boolean key1 = oldData.containsKey("s25_kernel_check");if (key1){s25_kernel_check1 = (ArrayList) oldData.get("s25_kernel_check");}//添加的bug信息HashMap<String, Object> stringObjectHashMap = new HashMap<>();//.....添加本条新bug数据s25_kernel_check1.add(stringObjectHashMap);oldData.put("s25_kernel_check",s25_kernel_check1);//构建插入数据IndexQuery indexQuery = new IndexQuery();//指定id,覆盖原有数据indexQuery.setId(oldData.get("id").toString());oldData.remove("id");JSONObject newData=new JSONObject(oldData);//插入数据indexQuery.setSource(newData.toString());//索引indexQuery.setIndexName("information_result");//类型indexQuery.setType("fulldata");//3.添加到queriesqueries.add(indexQuery);
}
//4.添加数据
template.bulkIndex(queries);
queries.clear();


http://chatgpt.dhexx.cn/article/8aj7fW2p.shtml

相关文章

MQ消息

AMQP协议介绍 AMQP&#xff0c;即Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff0c;是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计。 AMQP的主要特征是面向消息、队列、路由&#xff08;包括点对点和发布/订阅&#xff09;、可靠性…

MQ基础信息mq的简介

MQ 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…

MFQ

一什么是MFQ&PPDCS&#xff1f;MFQ&PPDCS是由外部教练邰晓梅提出的一套测试分析和测试设计方法。MFQ将被测对象分层&#xff0c;针对不同层次进行测试分析和设计进行&#xff0c;使测试设计人员不会那么容易忘记一些测试的相关点&#xff08;功能交互、质量属性&#x…

MQ的了解

MQ的了解&#xff1a; 如果进行产品选型 Kafka 优点&#xff1a;吞吐量非常大&#xff0c;性能非常好&#xff0c;集群高可用。 缺点&#xff1a;会丢数据&#xff0c;功能比较单一 使用场景&#xff1a;日志分析、大数据采集 RebbitMQ 优点&#xff1a;消息可靠性高&…

多级反馈队列调度算法(MFQ)

多级反馈队列调度算法是目前公认的较好的一种进程调度算法,它能较好的满足各类进程的需要。 MFQ算法首先设置多个就绪队列。队列的优先级递减,且各队列时间片大小也不同。例如我实现的算法里,设置了3个队列,第一队列优先级>第二队列>第三队列,且后一个队列的时间片大…

从MFQ方法到需求分析

前几天看了一篇性能测试相关的文章&#xff1a;性能测试模型初探及应用方法分析&#xff0c;其中提到了MFQ分析方法。专门去查阅了MFQ相关的一些资料&#xff0c;学习了一番。 之后想起了以前看《Google的软件测试之道》这本书时&#xff0c;书中提到的一种测试分析方法&#x…

nRF24l01无线传输

模块简介&#xff1a; 它是一款工作于2.4GHZ~2.5GHZISM频段&#xff0c;带功放通信距离可达上千米&#xff0c;近距离传输速度可达2Mbps&#xff0c;具有6通道且每通道都有自己的缓冲区&#xff0c;可以同时跟不同的NFR进行通信的无线收发模块。 工作模式&#xff1a;接收模式…

C51- NRF24L01 无线串口模块

1.硬件知识 1.1 nRF24L01的引脚功能 &#xff08;IO方向是相对模块而言的&#xff09; CE&#xff1a;Chip Enable&#xff0c;芯片使能&#xff0c;在发送和接收过程中都要将这个引脚拉高。 IRQ: 低电平触发&#xff0c;当状态寄存器中 TX_DS、RX_DR 或 MAX_RT 为高时触发中断…

NRF24L01+模块实现双向通信(带ACK payload)

本文主要关于NRF24L01 2.4GHz无线模块的应用。 目录 说明模块开发的大致步骤使用方式一、单向通信二、双向通信&#xff08;有应答包(ACK payload))寄存器配置 三、星状组网 注意事项 说明 1、NRF24L01和NRF24L01的区别&#xff0c;前者支持Enhanced ShockBurst™,后者不支持…

2.4G模块NRF24L01调试经验

参照野火STM32程序调试NRF24L01成功&#xff0c;颇获喜感 nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型SchockBurstTM模式控制器、功率放大器、警惕振荡器、调制器、解调器。输出功率、频道选择和协议的…

小体积、高速率的nRF24L01芯片通信模块

在选择纯硬件通信模块时&#xff0c; 面对上述问题&#xff0c;AS01提供了很好的解决办法。 AS01系列模块是工作在2.4GHz(ISM频段)的纯硬件模块。此系列基于NORDIC原装nRF24L01P芯片方案开发&#xff0c;提供多种接口形式&#xff0c;具有高空速&#xff08;最高空速可达到2…

Arduino使用NRF24L01模块进行无线通信

Arduino使用NRF24L01模块进行无线通信 前言 ​ 其实CSDN有很多关于这个无线模块的使用&#xff0c;包括Arduino的使用例程&#xff0c;但是实际自己跟着做一遍的时候还是发现了有些小问题&#xff0c;于是记录一下方便以后做其他有意思的小项目。&#xff08;Arduino的库文件…

nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)

作者&#xff1a;李剀 出处&#xff1a;https://www.cnblogs.com/kevin-nancy/ 或者 https://blog.csdn.net/Kevin_8_Lee/article/details/95667604 欢迎转载&#xff0c;但也请保留上面这段声明。谢谢&#xff01;&#xff08;上面两个都是我的博客&#xff0c;只是在不同平台…

STM32控制NRF24L01无线模块进行通信

一.NRF2401无线模块 1.模块介绍 功能介绍 (1)2.4Ghz 全球开放ISM 频段免许可证使 2) 最高工作速率2Mbps&#xff0c;高效GFSK调制&#xff0c;抗干扰能力强&#xff0c;特别适合工业控制场合 (3)126 频道&#xff0c;满足多点通信和跳频通信需要 (4) 内置硬件CRC 检错和点对…

NRF24L012.4G模块

文章目录 datasheet1. 相关案例&#xff1a;2. nRF24L01通信的常识1. 发送模式。1.5 补充spi一点知识1. SPI读写时序2. 工作模式2.1 收发模式Enhanced ShockBurstTM收发模式Enhanced ShockBurstTM发送流程&#xff1a;Enhanced ShockBurstTM接收流程&#xff1a; 3. SPI指令 3.…

STM32驱动NRF24L01无线模块

目录 一、模块简介二、工作模式三、主要命令四、配置寄存器五、状态寄存器六、接收模式七、发送模式八、STM32使用NRF24L01模块 一、模块简介 NRF24L01是NORDIC公司生产的一款无线通信芯片&#xff0c;采用FSK调制&#xff0c;内部集成NORDIC自己的Enhanced Short Burst 协议&…

nRF24L01无线模块笔记

nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据传输. nRF24L01是一个能兼顾距离和数据速率的无线模块, 在空旷环境下&#xff0c;2M速率15米, 1M速率30米, 250K速率能达到50米. 和蓝牙…

NRF24L01+模块:一对一双向通信,成功!

查找了很多资料&#xff0c;好多都是复制粘贴转发&#xff0c;或者安装英文手册直译的&#xff08;比如我自己上篇笔记&#xff0c;&#xff0c;&#xff09;&#xff0c;看完还是一脸懵逼&#xff0c;没几个可行的&#xff0c;推荐几个比较实在的资料&#xff1a;手册我也不是…

NRF24L01 无线通信模块使用方法

原文出处&#xff1a;http://blog.csdn.net/mc_hust/article/details/39473913 昨天登录百度账号&#xff0c;无意间发现漏看了好多朋友的私信&#xff0c;其中不少是找我探讨关于NRF2401模块的。从12年到14年的信件都有&#xff08;平时很少注意系统提示信息。。。&#xff0…

STM32 + 无线通信模块 NRF24L01 数据收发

NRF24L01的模块资料&#xff0c;网上已很详尽了&#xff0c;在这不再重复描述知识点了。 这篇文章的目的&#xff0c;旨在把主要知识点胶接起来&#xff0c;梳理成一套完整的步骤&#xff0c;使器件快速上手汇入工作使用。 将按操作顺序&#xff0c;拆分成7个步骤&#xff0c;…