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

这篇具有很好参考价值的文章主要介绍了elasticsearch 父子文档使用must not 正确姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求描述:

1、基于elasticsearch 父子文档进行子条件查询父文档
2、需要查询出子文档不存在的父文档

已知文档结构:

1、父文档clue_list 关联很多的子文档,我们用roam子文档做测试!
elasticsearch 父子文档使用must not 正确姿势
2、roam子文档的结构

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 5.4327264,
    "hits" : [
      {
        "_index" : "clue_list",
        "_type" : "_doc",
        "_id" : "roam_668414740279590913",
        "_score" : 5.4327264,
        "_routing" : "668164507591245825",
        "_source" : {
          "companyId" : 1,
          "companyRoamCount" : 0,
          "centreRoamCount" : 0,
          "depRoamCount" : 2,
          "publicRoamCount" : 0,
          "joinFiled" : {
            "parent" : "668164507591245825",
            "name" : "roam"
          }
        }
      }
    ]
  }
}

小试牛刀

需求是查询出roam子文档不存在的数据,由于我们es的所有数据companyId == 1 我们可以用must not来排除 companyId == 1的数据

1、错误的查询方式,直接must not匹配

GET clue_list/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "joinFiled": {
              "value": "clue_list"
            }
          }
        },{
          "has_child": {
            "type": "roam",
            "query": {
              "bool": {
                "must_not": [
                  {
                    "term": {
                      "companyId": {
                        "value": 1
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

结果:

{
  "took" : 80,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

结论:直接匹配没有查询出目标数据,由于must not排除了companyId == 1的数据,但是由于我们数据库并没有其他数据,此时查询子文档返回数据为空,子文档为空匹配父文档造成返回数据为空。

2、正确的姿势,先查询出companyId == 1的数据,然后取反将must not放在外层
es执行语句:

GET clue_list/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "joinFiled": {
              "value": "clue_list"
            }
          }
        },{          
          "bool": {
            "must_not": [
              {
                "has_child": {
                  "type": "roam",
                  "query": {
                    "term": {
                      "companyId": {
                        "value": 1
                      }
                    }
                  }
                }
              }
            ]
          }
          
        }
      ]
    }
  }
}

响应数据:
elasticsearch 父子文档使用must not 正确姿势

验证第一条数据是否不存在roam子文档:
elasticsearch 父子文档使用must not 正确姿势

结论:正确查询出不存在roam子文档的数据

寄语:
es父子文档查询通过子文档过滤父文档且需要用到must not的时候,如果有子文档有为空的情况,则需要先查询不满足条件的再在父层级进行排除,如果子文档一定不会为空才能够直接进行排除操作;
当然,懒人适用的方式就是直接用第二种方案,都在上层进行排除不满足条件的数据。
文章来源地址https://www.toymoban.com/news/detail-452190.html

到了这里,关于elasticsearch 父子文档使用must not 正确姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Kali字典正确使用姿势

    终端输入wordlists,可以查看自带字典。ls -al 查看具体路径 /usr/share/wordlists/目录下带了rockyou的字典。2009年一家名叫rockyou的公司遭到了黑客攻击,他们的密码列表以明文存储,黑客下载了所有的密码列表并且公开。rockyou.txt包含14341564个唯一密码,用于32603388个帐户。 rockyou.t

    2024年02月06日
    浏览(46)
  • 【Elasticsearch】 10-DSL语法详解-复合查询bool(must、should、must_not、filter)

    Elasticsearch是一个强大的搜索引擎,它提供了丰富的查询功能,以帮助你从大规模数据集中检索相关的文档。在Elasticsearch中, bool 查询是一个非常重要和强大的工具,它允许组合多个查询子句,以构建复杂的查询逻辑。在本篇文章中,我们将深入探讨 bool 查询,包括其概述、

    2024年02月05日
    浏览(43)
  • 阿里开源的TransmittableThreadLocal的正确使用姿势

     目录 1. 直接使用 TransmittableThreadLocal 2. 在使用线程池的情况下使用 TransmittableThreadLocal 3. 使用 TtlExecutors 的使用案例 (推荐) 4. 拓展                 TransmittableThreadLocal是阿里巴巴开源的一个线程本地变量,它是ThreadLocal的一个增强版,可以在线程池等多线程环境下使

    2024年02月16日
    浏览(40)
  • Android中正确使用Handler的姿势

    在Android中,Handler是一种用于在不同线程之间传递消息和任务的机制。以下是在Android中正确使用Handler的一些姿势: 1. 在主线程中创建Handler对象 在Android中,只有主线程(也称为UI线程)可以更新UI。因此,如果您需要在后台线程中执行某些任务并更新UI,则需要使用Handler将任

    2024年02月11日
    浏览(47)
  • windows自带远程桌面连接的正确使用姿势

    目前远程办公场景日趋广泛,对远程控制的需求也更加多样化,windows系统自带了远程桌面控制,在局域网内可以实现流程的远程桌面访问及控制。互联网使用远程桌面则通常需要使用arp等内网穿透软件,市场上teamviewer、Todesk、向日葵等远程桌面软件十分优秀,window系统也自

    2024年02月10日
    浏览(46)
  • SpringBoot项目中使用缓存Cache的正确姿势!!!

    缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性。我想大家的项目中或多或少都有使用过,我们项目也不例外,但是最近在review公司的代码的时候写的很蠢且low, 大致写法如下: 其实Spring Boot 提供了强大的缓

    2023年04月10日
    浏览(31)
  • 解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

    今天,让我们深入研究 has_child 查询和 has_parent 查询,这将帮助我们将 2 个不同的文档组合到一个索引中,从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时,我们必须使用 join 数据类型。更多有关

    2024年02月02日
    浏览(41)
  • 逍遥自在学C语言 | 条件控制的正确使用姿势

    在C语言中,有三种条件判断结构:if语句、if-else语句和switch语句。 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 基本语法 代码示例 运行结果 基本语法 代码示例 运行结果 代码示例 在这个示例中

    2024年02月03日
    浏览(54)
  • 开闭原则正确姿势, 使用AOP优雅的记录日志, 非常的哇塞

    👳我亲爱的各位大佬们好😘😘😘 ♨️ 本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️ 如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛 👨‍🔧 个人主页 : 阿千弟 🔥

    2024年02月06日
    浏览(38)
  • 【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7

    在开发一个D3应用的时候遇到了一个 zoom 相关的问题,记录解决思路与方案 问题重现 最近在开发一个D3应用的时候遇到了一个 zoom 相关的问题,应用里有一个功能叫 全景聚焦 。我们都知道画布由两个标签组成(见实现autoZoom(),画布自适应放缩并居中@D3.js-v5),最外层的是固定

    2024年02月16日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包