在 Elasticsearch 中搜索所有嵌套子级与给定查询匹配的对象

2024-03-20

给定一个具有以下映射的对象:

{
    "a": {
        "properties": {
            "id": {"type": "string"}
            "b": {
                "type": "nested",
                "properties": {
                    "key": {"type": "string"}
                }
            }
        }
    }
}

我想检索该对象的所有实例,其中所有嵌套子对象都与给定查询匹配。

例如,假设我想检索所有子级都为“key”=“yes”的实例。 鉴于以下情况:

{
    "id": "1",
    "b": [
        {
            "key": "yes"
        },
        {
            "key": "yes"
        }
    ] 
},
{
    "id": "2",
    "b": [
        {
            "key": "yes"
        },
        {
            "key": "yes"
        },
        {
            "key": "no"
        }
    ] 
},

我只想检索第一个(“id”=“1”的那个)。

使用过滤器或查询对我来说都很好。 我已经尝试使用“不过滤 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-not-filter.html”和“Must_not 布尔过滤器 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html“。这个想法是使用双重否定来仅提取不具有与给定字段不同的字段的对象。 但是,我无法正确写下这个查询。

我意识到这不是搜索引擎的常见查询,但就我而言,它可能很有用。

是否可以使用嵌套对象编写此查询(“forall 嵌套查询”)? 如果不是,是否可以使用父子来编写此查询?

Update

如果我们知道我们想要避免的“key”的所有值(在示例中为“no”),Andrei Stefan 给出了一个很好的答案。

我也对您不知道要避免的值的情况感兴趣,并且您只想将嵌套对象与“key”=“yes”匹配。


为此,您需要一个扁平化的数据结构 - 值数组。最简单的方法,不要过多改变当前映射,是使用include_in_parent属性并查询父级中包含的字段以满足此特定要求:

{
  "mappings": {
    "a": {
      "properties": {
        "id": {
          "type": "string"
        },
        "b": {
          "type": "nested",
          "include_in_parent": true,
          "properties": {
            "key": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

然后你的查询将如下所示:

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "query": {
              "query_string": { "query": "b.key:(yes NOT no)"}
            }
          }
        ]
      }
    }
  }
}

另一种方法是更改​​字段的类型nested to object但这样你就会失去使用的优点nested fields:

{
  "mappings": {
    "a": {
      "properties": {
        "id": {
          "type": "string"
        },
        "b": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

查询保持不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Elasticsearch 中搜索所有嵌套子级与给定查询匹配的对象 的相关文章

随机推荐

  • ORA-00060: 等待资源时检测到死锁

    我有一系列脚本作为 nohup 在托管 Oracle 10g 的 AIX 服务器上并行运行 这些脚本是由其他人编写的 旨在同时执行 所有脚本都在表上执行更新 我收到错误 ORA 00060 检测到死锁 等待资源 当我用谷歌搜索这个时 我发现
  • 如何插入包含页码、文件路径和图像的页脚?

    I m trying to format the footer so it has the page x out of y on the top right of the footer and then the image centered
  • 使用 Velocity 和 Jasmine 测试 Meteor 时需要超时

    对于流星 速度和茉莉花来说还很陌生 所以不确定我是否做错了什么 使用茉莉花来做它不适合的事情 或者这只是它的工作方式 我发现我需要为几乎所有测试设置超时才能让它们通过 应该是这种情况还是我做错了什么 例如 我正在运行一些测试来检查验证消息
  • 当列表项很少时,如何将页脚视图显示到屏幕末尾?

    我想向列表视图添加页脚 当列表项数量较多时 页脚效果很好 但是当列表视图的项目很少时 页脚会显示在屏幕中间 就在列表视图的下方 这看起来很破旧 在这种情况下 我希望页脚与父底部对齐 谢谢你的期待 这是你想要的最简单的例子 你可以自定义它
  • cocos2d中忽略精灵的透明区域

    我已经被困了好几个星期了 现在试图找出如何忽略对精灵透明区域的触摸 我一直在尝试使用本教程来跟踪像素完美碰撞 http www learn cocos2d com 2011 12 fast pixelperfect collision de
  • Python 单元测试 - 如何修补我正在测试的方法内部的异步调用

    我使用 unittest mock 为我的 python 代码构建测试 我有一个正在尝试测试的方法 其中包含对另一个函数的异步调用 我想修补该异步调用 以便我可以让 Mock 返回一个测试值asset id 而不是实际调用异步方法 我尝试了
  • std::memory_order_seq_cst 的工作原理

    我从以下位置获取了有关 std memory order seq cst 的示例 http en cppreference com w cpp atomic memory order http en cppreference com w c
  • HTML 输入换行文本而不是水平溢出

    我有一个input字段 用户将在其中输入文本 当文本变得太长时 输入字段会水平延伸 而不是垂直下降 我尝试添加这个CSS overflow hidden word wrap break word 但我没有运气 关于如何实现这一目标还有其他建
  • 在 VBA (Excel) 中获取时区信息

    我想在 VBA 中确定不同国家 地区在特定日期的 GMT UTC 时间偏移 包括夏令时 有任何想法吗 编辑 来自自我回答 谢谢 0xA3 我快速浏览了链接页面 我假设您只能获取 Windows 运行所在本地的 GMT 偏移量 Convert
  • 如何构建一个 GUI 以在 jupyter 笔记本中使用?

    这个想法是能够在笔记本中构建和使用 GUI 因此使用具有大量参数的长函数比仅在笔记本中键入字符更有效 显然不是具体细节 但如果有人可以指出一些可能有帮助的库 项目 链接或任何资源 我查遍了互联网 到目前为止什么也没有 PyData 中有一个
  • git clone 不签出活动分支

    我有一个远程裸存储库 有两个分支 master 和 testing 其中 HEAD 指 testing 克隆此存储库时 git 检查 master 如果 master 和 testing 位于同一修订版上 即 HEAD test maste
  • Eclipse 任务为空

    我正在使用 Eclipse Helios 并在我的 java 类中添加了一些任务 使用 TODO blah blah 在行计数附近 我有一个小图标 表明任务已被识别 但我在任务视图中看不到它们 我尝试了任务视图和任务列表视图 它们是空的 但
  • 如何在量角器中调用另一个函数中的函数

    第一个功能 describe Shortlisting page function it Click on candidate status Screened function element by css i flaticon lefta
  • 以编程方式将下拉列表添加到特定单元格

    我想知道如何使用 VBA 以编程方式将下拉列表添加到 Excel 工作表的特定单元格 例如 我希望能够向单元格 i j 添加下拉列表并定义列表的元素 以编程方式执行此操作 With Selection Validation Delete A
  • 使用 dapper 查询空间数据

    我找到了一些相关的问题 https stackoverflow com questions 18088169 dapper spatial geography type 但作者放弃了 继续使用存储过程来进行 映射 这实际上是一个延续问题he
  • 如何使用 Laravel Passport 生成短令牌?

    我使用 Laravel Passport 和密码授予模式 我发现它生成的访问令牌很长 如下所示 token type Bearer expires in 31536000 access token eyJ0eXAiOiJKV1QiLCJhb
  • 没有 元素的 selenium 文件上传

    我正在尝试使用 selenium python 上传我的简历here https boards greenhouse io robinhood jobs 996796 app 在简历 简历附件部分下 当我检查 Attach 元素时 它显示为
  • java.lang.OutOfMemoryError:为 ChunkPool::allocate 请求 32756 字节。交换空间不足?

    我正在使用通过 WebLogic 10 3 部署在 HP 服务器上的 java 应用程序 版本信息 WebLogic Version 10 3 OS Version B 11 23 java version java version 1 6
  • 为什么这个工厂返回 $$state 对象而不是 response.data?

    所以我在服务器中有一个对象集合 我想在页面加载时填充 ng repeat 我创建了一个工厂 它从服务器上的资源中获取列表 如下所示 app factory objectArray http function http This is ret
  • 在 Elasticsearch 中搜索所有嵌套子级与给定查询匹配的对象

    给定一个具有以下映射的对象 a properties id type string b type nested properties key type string 我想检索该对象的所有实例 其中所有嵌套子对象都与给定查询匹配 例如 假设我