es的must_not的踩坑

这篇具有很好参考价值的文章主要介绍了es的must_not的踩坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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


一、需求背景

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

二、坑

2.1 坑一

目标测试数据为:
es must not,bug记录总结,elasticsearch,面试,经验分享

这是一条面试时间为10.21、且面评不合格的一条数据。
一开始拼接的dsl语句为(to默认为当前时间戳):
es must not,bug记录总结,elasticsearch,面试,经验分享

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

es must not,bug记录总结,elasticsearch,面试,经验分享
以至于这条数据在内层因为面试不通过就被筛出来了,而无关面试结束在x个月。最后再来一个must_not导致无法hit。

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

2.2 坑二

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

例如:
es must not,bug记录总结,elasticsearch,面试,经验分享
那么这条数据如果在面试在超过这个时间不通过的情况下对于上面的数据理应不该被搜出来。
可是如果是用刚刚拼接好的完整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。
es must not,bug记录总结,elasticsearch,面试,经验分享
发现直接取反后的结果竟然也是被hit到了,也就是最外层的must/must_not的结果失效了。
那么比对一下两者数据的差别:在于nested的数据长度上。
那么可以得到一个猜想:关于nested内的must,must_not,最终只是hit其中一段元数据。也就是虽然这个数据被排除了,但是这个nested列表中的第二条、第三条… hit了,那么这个候选人依旧可以选出来。也就是说红框这部分被搜索出来了:
es must not,bug记录总结,elasticsearch,面试,经验分享
如果想要排除这个人,那么可以猜想需要直接把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中的元素。文章来源地址https://www.toymoban.com/news/detail-797581.html

到了这里,关于es的must_not的踩坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript基础语法之 || 和 ?? 的踩坑记录

    在前端开发过程中,我们在设置默认值的时候,会经常用到 || 和 ?? , 但是这两者有什么区别呢?分别在什么场景下面使用呢,会有哪些坑呢,今天我们来梳理下呢。 在这里可以看出,使用 || 的时候,当第一个值为非0非null非\\\'\\\'非undefined的时候,优先取第一个值,而当第一个值

    2024年02月06日
    浏览(30)
  • [Elasticsearch] ES更新问题踩坑记录,直面秋招

    基本可以定位是在es更新这块出问题了 看对应代码 final TableDocBean docBean = baseSearchService.getById(id); setValueForBean(afterColumns, docBean); log.info(“update table data to es: {}”, JSON.toJSONString(docBean)); baseSearchService.update(docBean); 代码先通过表id 获取对应ES文档,然后赋值 执行更新数据操作 这块

    2024年03月25日
    浏览(37)
  • decapoda-research/llama-7b-hf 的踩坑记录

    使用transformers加载decapoda-research/llama-7b-hf的踩坑记录。 ValueError: Tokenizer class LLaMATokenizer does not exist or is not currently imported. 解决办法: https://github.com/huggingface/transformers/issues/22222 将tokenizer_config.json中LLaMATokenizer改为LlamaTokenizer。 RecursionError: maximum recursion depth exceeded while getting

    2024年02月07日
    浏览(75)
  • RT-Thread在STM32硬件I2C的踩坑记录

    参考文章: 1.将硬件I2C巧妙地将“嫁接”到RTT原生的模拟I2C驱动框架 2.基于STM32F4平台的硬件I2C驱动实现笔记 3.《rt-thread驱动框架分析》- i2c驱动   最近打算用RT-Thread做一个小demo玩玩,其中需要用I2C通信驱动一个oled屏幕,但是找了一圈也没找到RTT中对硬件I2C的支持方式以及

    2024年02月11日
    浏览(37)
  • Xubuntu16.04系统中create_ap开启5G网络的踩坑记录

    Xubuntu16.04系统中安装create_ap创建无线AP: https://blog.csdn.net/qq_45445740/article/details/133972642?spm=1001.2014.3001.5501 /etc/create_ap.conf 推荐测试信号强度的APP 有时候明明信号强度很好,但延时却很高,可能是当前信道的网络较多。 要判断哪个信道不拥堵,可以考虑以下几个因素: 信道的

    2024年02月08日
    浏览(24)
  • gitlab配置使用ssh(clone)拉取项目失败的踩坑排查记录(配置了SSHkey仍然不能正常拉取代码)

    说起这个由来有一点尴尬,以前公司使用svn,使用git不多,后来由于项目管理和人员协作的需要开始使用git作为项目版本管理,以前的项目管理感觉比较混乱,所以就搭建了gitlab,gitlab-runner来作为项目管理,项目版本管理和自动化部署CICD,这样也确实提高了效率,但是呢,由

    2024年02月13日
    浏览(33)
  • 【el-upload】批量上传图片时在before-upload中添加弹窗判断时的踩坑记录

    上传文件前判断是否是pdf文件,如果是则弹出如下是否增加水印提示框 批量选择文件,碰到pdf文件,依次弹出如上提示框 若勾选了为后续pdf文件执行相同操作,则不再弹出如上提示框 若选择的文件中只有一个pdf文件,则不显示提示框中的复选框和“为后续pdf文件执行相同操

    2024年02月13日
    浏览(25)
  • elasticsearch 父子文档使用must not 正确姿势

    1、基于elasticsearch 父子文档进行子条件查询父文档 2、需要查询出子文档不存在的父文档 1、父文档clue_list 关联很多的子文档,我们用roam子文档做测试! 2、roam子文档的结构 需求是查询出roam子文档不存在的数据,由于我们es的所有数据companyId == 1 我们可以用must not来排除 co

    2024年02月05日
    浏览(30)
  • Elasticsearch(es)中must以及term的基本使用

    在 Elasticsearch(ES)中,should 和 must 是布尔查询(Boolean Query)中常用的两个子句。 should 子句:should 表示一个或多个条件之一满足即可匹配文档。它类似于逻辑上的 OR 操作,用于构建可选项或者提升匹配文档的相关性评分。当至少一个 should 子句匹配时,文档将被认为是匹配

    2024年01月22日
    浏览(31)
  • python 安装openai的踩坑史

    注意,一定要python的版本 一定要 3.9及以下!! 否则一直会出错 出错 ImportError: cannot import name ‘COMMON_SAFE_ASCII_CHARACTERS’ from ‘charset_normalizer.constant’ (D:anaconda3envsAIGClibsite-packagescharset_normalizerconstant.py) 用 都不管用 最好python=3.8 否则openai的有些库不能用 又是出错 这时候

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包