es的must_not的踩坑

article/2025/9/20 22:31:16

文章目录

  • 前言
  • 一、需求背景
  • 二、坑
    • 2.1 坑一
    • 2.2 坑二
  • 总结


前言

记录下在公司做需求时must_not踩的坑


一、需求背景

要去做人才库的一个排除项:排除x个月面试不通过。实际上的dsl语句则对应的是must_not。且内部要包含两个元素:x个月、面试不通过(C、D)取交集。

二、坑

2.1 坑一

目标测试数据为:
在这里插入图片描述

这是一条面试时间为10.21、且面评不合格的一条数据。
一开始拼接的dsl语句为(to默认为当前时间戳):
在这里插入图片描述

  • 在must_not中同时拼接两个条件:1毫秒前面试不通过的,按理来说应该出现目标数据。可是确没有命中。
  • 接下来开始排查,将下面关于面试不通过的去掉:
    在这里插入图片描述
    发现可以hit:
    在这里插入图片描述
    再换成将上面的时间去掉,发现找不到,符合预期结果。
    那么可以猜想:内层单个的should都生效了,问题点出现在了外层的must_not联合的作用上。
    直观点表示就是预期本来是这样的:
    在这里插入图片描述
    可是实际上却变成了这样:

在这里插入图片描述
以至于这条数据在内层因为面试不通过就被筛出来了,而无关面试结束在x个月。最后再来一个must_not导致无法hit。

  • 那么为了验证我们的猜想可以做这样的操作:
    在这里插入图片描述
    也就是在之间再通过must将两者关联起来,再来一个must_not。对应的dsl语句为:
    在这里插入图片描述
    这时候再来试一次:
    在这里插入图片描述
    发现可以命中的到,而改大时间范围:
    在这里插入图片描述
    发现已经搜索不到了。这时就可以得出结论。
  • 对于must_not中有多个must或者should(如果是should得保证同级没must具体见官方文档),他其实是must_not:must + must_not:must。而不是内层先进行包含,最后再进行must_not。如果要实现内层包含。则应该内层嵌套一个must进行联合。

2.2 坑二

  • 还是对于同一个需求,虽然改好了上面的漏洞。但是其实还是有一个问题:上面的数据其实为在nested列表对象下长度为1的一条数据。那么试想一下换另外一条数据呢?

例如:
在这里插入图片描述
那么这条数据如果在面试在超过这个时间不通过的情况下对于上面的数据理应不该被搜出来。
可是如果是用刚刚拼接好的完整dsl:

"nested": {"query": {"bool": {“must_not": [{"bool": {"must": [{"bool": {"should": [{"range": {"interviewInfos.interviewEndTime": {"from": "1651388570","to": "1667185560684","include_lower": true,"include_upper": true,"boost": 1}}}],"adjust_pure_negative": true,"boost": 1}},{"bool": {"should": [{"terms": {"interviewInfos.interviewScore": ["U004","U005"],"boost": 1}}],"adjust_pure_negative": true,"boost": 1}}]}}],"adjust_pure_negative": true,"boost": 1}},"path": "interviewInfos","ignore_unmapped": false,"score_mode": "max","boost": 0}"nested": {"query": {"bool": {“must_not": [{"bool": {"must": [{"bool": {"should": [{"range": {"interviewInfos.interviewEndTime": {"from": "1651388570","to": "1667185560684","include_lower": true,"include_upper": true,"boost": 1}}}],"adjust_pure_negative": true,"boost": 1}},{"bool": {"should": [{"terms": {"interviewInfos.interviewScore": ["U004","U005"],"boost": 1}}],"adjust_pure_negative": true,"boost": 1}}]}}],"adjust_pure_negative": true,"boost": 1}},"path": "interviewInfos","ignore_unmapped": false,"score_mode": "max","boost": 0}

但是结果是会hit,而不会被排除。
那么接下来继续排查,排查的一个关键点在于我直接把最外层的must_not直接改成must。
在这里插入图片描述
发现直接取反后的结果竟然也是被hit到了,也就是最外层的must/must_not的结果失效了。
那么比对一下两者数据的差别:在于nested的数据长度上。
那么可以得到一个猜想:关于nested内的must,must_not,最终只是hit其中一段元数据。也就是虽然这个数据被排除了,但是这个nested列表中的第二条、第三条… hit了,那么这个候选人依旧可以选出来。也就是说红框这部分被搜索出来了:
在这里插入图片描述
如果想要排除这个人,那么可以猜想需要直接把must_not放在nested外面。也就是:

"must_not": [{ "nested": {"query": {"bool": {"must": [{"bool": {"must": [{"bool": {"should": [{"range": {"interviewInfos.interviewEndTime": {"from": "1667203393540","to": "1667203393541","include_lower": true,"include_upper": true,"boost": 1}}}],"adjust_pure_negative": true,"boost": 1}},{"bool": {"should": [{"terms": {"interviewInfos.interviewScore": ["U004","U005"],"boost": 1}}],"adjust_pure_negative": true,"boost": 1}}]}}],"adjust_pure_negative": true,"boost": 1}},"path": "interviewInfos","ignore_unmapped": false,"score_mode": "max","boost": 0}}],

修改发现符合最终需要的结果。

总结

踩了这几个坑,虽然写出来排查的过程很简单,但实际还是挺头疼的,需要不断的进行变量对比。不断的去写dsl语句,最终在文中只是关键的排查点。得到的经验也很简单,要从最里层一层一层的扒。每个must,must_not就像一层层列表便利,只不过每次遍历就是must,must_not中的元素。


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

相关文章

elasticsearch 父子文档使用must not 正确姿势

需求描述: 1、基于elasticsearch 父子文档进行子条件查询父文档 2、需要查询出子文档不存在的父文档 已知文档结构: 1、父文档clue_list 关联很多的子文档,我们用roam子文档做测试! 2、roam子文档的结构 {"took" :…

Elasticsearch 的Java API使用匹配空或者是null字段

全文检索数据权限控制,需要根据业务权限配置; 本组成员包括查看自己【有些模块本来就没有分组】,此时需要查询groupId为null,但是creator为自己的数据! 参考案例 .must(QueryBuilders.existsQuery("message&qu…

ES-3-高级查询

文章目录 1 深分页Scroll1.1 分页的查询过程1.2 Scroll查询的实现 2 delete-by-query3 ES的复合查询3.1 bool查询3.2 boosting查询 4 filter查询5 高亮查询6 聚合查询6.1 去重计数查询cardinality6.2 范围统计range6.3 统计聚合查询extended_stats 1 深分页Scroll 1.1 分页的查…

Elasticsearch嵌套查询must和mustNot

场景:在bug关联固件的时候将bug的数据放到固件的数据下,可以根据固件数据下是否包含bug数据查询出已关联和未关联的数据。 ES文档结构 目录 1.must查询此bug关联的固件 java代码 2.mustNot查询此bug未关联的固件 java代码 3.劫后余生 4.闲来…

MQ消息

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

MQ基础信息mq的简介

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

MFQ

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

MQ的了解

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

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

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

从MFQ方法到需求分析

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

nRF24l01无线传输

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

C51- NRF24L01 无线串口模块

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

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

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

2.4G模块NRF24L01调试经验

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

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

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

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

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

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

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

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

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

NRF24L012.4G模块

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

STM32驱动NRF24L01无线模块

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