elasticsearch之嵌套对象、父子文档

2023-10-29

一,嵌套对象

es并非关系型数据库,它并不擅长关系型数据库的join操作。在存储数据时,用冗余数据替代查询时的关联。

如blog和comments,如果用关系型数据库,会将blog存一个表,comments存另一个表,然后将这两个表关联起来。

在es中可以这样存储:

PUT /nested_index/_doc/1
{
  "title": "Nest eggs",
  "body":  "Making your money work...",
  "tags":  [ "cash", "shares" ],
  "comments": [ 
    {
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    },
    {
      "name":    "Alice White",
      "comment": "More like this please",
      "age":     31,
      "stars":   5,
      "date":    "2014-10-22"
    }
  ]
}

查询时就很高效,一次把文档和关联的信息查出来。

不过,在用es查询时,可能出现一些意外情况:

GET nested_index/_search
{
  
  "query": {
         "bool": {
            "must": [
              {
                "match": {
                  "comments.name": "john"
                }
              },
              {
                "match": {
                  "comments.age": "31"
                }
              }
            ]
          }
      }
}

本来,根据john+31是不应该查出数据的,因为john是28岁,实际上却能查出来结果。

原因在于es存储object对象时会将对象扁平化处理:

{
   "blog":"aking your money work...",
   "comments.name":["john","alice"],
   "comments.age":[31,28]
}

这样子,就失去了边界,两个comments就区分不了了。

这种情况下,可以用到嵌套对象,嵌套对象的mapping不能动态创建,必须在索引文档之前创建。

PUT /nested_index2
{
  "mappings": {
    "properties": {
      "comments":{
        "type": "nested"
      }
    }
  }
}

再次查询

GET nested_index2/_search
{
  
  "query": {
    "nested": {
      "path": "comments",
      "query": {
         "bool": {
            "must": [
              {
                "match": {
                  "comments.name": "john"
                }
              },
              {
                "match": {
                  "comments.age": "31"
                }
              }
            ]
          }
      }
    }
  }
}

这时查询31岁的john就不会有结果了,把条件age改成28就可以了。

原理就是对于nested对象,es会将其抽取出来作为独立的文档,并保留文档之间的关联关系,在查询时,把相应文档关联起来。

二,父子文档

可以把结构相同但有父子关系的文档存储在同一个索引中,在形式上父子文档都是独立的文档,互相之间的修改、更新都是独立的,在逻辑上二者是有层次关系的。

1,设置mapping,设置一个field用于识别父子关系的key,这个field的类型时join,relations用来指明父子关系:answer是子文档,question是父文档。

PUT join_index
{
  "mappings": {
    "properties": {
      "my_join_field": { 
        "type": "join",
        "relations": {
          "question": "answer" 
        }
      }
    }
  }
}

2,插入父文档时要指明文档类型

PUT join_index/_doc/1?refresh
{
  "text": "This is a question",
  "my_join_field": {
    "name": "question" 
  }
}

PUT join_index/_doc/2?refresh
{
  "text": "This is another question",
  "my_join_field": {
    "name": "question"
  }
}

3,插入子文档时用routing关键字,指明文档类型和父文档id

PUT join_index/_doc/3?routing=1&refresh
{
  "text": "This is an answer",
  "my_join_field": {
    "name": "answer", 
    "parent": "1" 
  }
}

PUT join_index/_doc/4?routing=1&refresh
{
  "text": "This is another answer",
  "my_join_field": {
    "name": "answer",
    "parent": "1"
  }
}

4,根据父文档id查所有子文档

GET join_index/_search
{
  "query": {
    "parent_id":{
      "type":"answer",
      "id":"1"
    }
  }
}

5,根据父文档内容查询所有子文档

GET join_index/_search
{
  "query": {
    "has_parent": {
      "parent_type": "question",
      "query": {
        "match": {
          "text": "question"
        }
      }
    }
  }
}

6,根据子文档内容查询所有父文档

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

elasticsearch之嵌套对象、父子文档 的相关文章

  • jar包class冲突:spark任务执行异常-java.lang.NoSuchMethodError: org.apache.hadoop.fs.PartialListing

    问题描述 提交到yarn集群后任务报错 报错信息如下 java lang NoSuchMethodError org apache hadoop fs PartialListing 根据报错信息 初步估计是jar包冲突或者不同jar包有同名
  • 嘴说手画Spark的存储系统

    Spark本身并不存储数据 这里所说的存储系统是指计算过程中 管理内存中数据 如读到内存的源数据 缓存的RDD数据 广播数据 Shuffle文件数据的功能模块 如果没有存储管理系统 计算是无法完成的 存储系统的主要由以下组件构成 Block
  • 手撸代码-HADOOP-RPC

    4个类就可体验HADOOP RPC的简单 实用 一 writable rpc 一 协议 所谓协议 实际是一个接口 用来定义该RPC提供的功能 package rpc writeable public interface MyProtocol
  • elasticsearch之嵌套对象、父子文档

    一 嵌套对象 es并非关系型数据库 它并不擅长关系型数据库的join操作 在存储数据时 用冗余数据替代查询时的关联 如blog和comments 如果用关系型数据库 会将blog存一个表 comments存另一个表 然后将这两个表关联起来
  • 安装Apache Atlas遇到的错误

    安装apache atlas 启动atlas server报错 查看logs atlas 20220524 115239 out文件 Caused by org springframework beans factory Unsatisfi
  • hbase的hlog原理-如何保证数据高可靠、如何恢复数据-sequenceid原理

    hbase写入数据时 为了提升写入效率 先写入缓存memory store 默认为128M 缓存满了会触发flush落盘 写入hfile文件 但这种方式并不安全 如果缓存未满之前region server挂掉 还未来得及落盘的数据就会丢失
  • 数据仓库理论知识

    一 数据仓库与数据集市 可以简单理解为数据仓库是面向整个企业 而数据集市是面向某个部门的 数据集市的数据来自数据仓库 当然 如果没有数据仓库 数据集市的数据也可以直接取自业务数据库 1 离线与实时 离线数仓 从业务上看 对已知范围的数据定时
  • 我读zookeeper源码系列1

    一 准备工作 1 zookeeper版本 01 zookeeper 3 4 x 企业最常用 大数据技术组件最常用 基本维持在 3 4 5 3 4 6 3 4 7 这几个版本 02 zookeeper 3 5 x 03 zookeeper 3
  • Spark原理-SparkSql框架优化策略

    有了SparkCore为什么还要有SparkSql呢 有两大原因 一是SparkCore只能用Api 这就把很多SqlBoy拒之门外 Spark就无法发扬光大了 二是使用Api时用户编写的函数作为一个个闭包被序列化后分发到Executor执
  • 嘴说手画Spark的内存模型

    一 内存模型 Spark的内存模型如下图所示 Reserved Memory 固定为 300MB 不受开发者控制 是启动Spark框架本身所需要的内存空间 UserMemory 是用户空间 即用户定义的数据 通常是用户在代码中定义的变量 可
  • flume-使用KafkaChannel读取不到数据

    使用TAILDIR监听日志写入KafkaChannel 配置如下 a1 sources r1 a1 channels c1 描述source a1 sources r1 type TAILDIR a1 sources r1 filegrou
  • FlinkCDC-自定义序列化器

    package com lcy app customer import com alibaba fastjson JSONObject import com alibaba ververica cdc debezium DebeziumDe
  • 嘴说手画Spark的Bykey操作-groupByKey、reduceByKey、aggregateByKey 和 sortByKey

    之前写过一篇文章分析Spark Shuffle的原理 知道了Shuffle是性能杀手的原因 但在实际业务中 Shuffle操作通常不可避免 毕竟Spark基础的用途就是对大数据进行统计分析 由于数据分布的分散性 导致相同Key的数据汇集到一
  • 手撸算法-两数之和-牛客

    描述 给出一个整数数组 请在数组中找出两个加起来等于目标值的数 你给出的函数twoSum 需要返回这两个数字的下标 index1 index2 需要满足 index1 小于index2 注意 下标是从1开始的 假设给出的数组中只存在唯一解
  • Canal报错:Could not find first log file name in binary log index file

    解决方案 rm home admin canal server conf example meta dat 然后重启 home admin canal server bin restart sh
  • doris & StarRocks 错题本

    一 spark streaming load写入失败 Reason column count mismatch expect 25 real 1 src line demo masking 1 2018 02 17 1 B35C300672
  • Doris编译

    使用Doris 官方不提供编译好的jar包 需要自己编译 最方便的方式是通过Docker编译 避免了安装各种环境的繁琐 一 准备服务器 用虚拟机 云服务器都可以编译 不过编译所需要的内存以16G为佳 如果你的机器没有这么多内存 速度会比较慢
  • Hudi和Kudu的比较

    与Kudu相比 Kudu是一个支持OLTP workload的数据存储系统 而Hudi的设计目标是基于Hadoop兼容的文件系统 如HDFS S3等 重度依赖Spark的数据处理能力来实现增量处理和丰富的查询能力 Hudi支持Increme
  • IDEA编译报错:java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出

    IDEA编译Flink源码时报错 java 未报告的异常错误X 必须对其进行捕获或声明以便抛出 原因是环境变量配置的是JDK8 Flink部分代码是基于JDK11编写的 将JDK升级为JDK11 重新编译即成功
  • JAVA虚拟机灵魂之问:Xmx和Xms不一致对虚拟机性能有何影响

    使用jvisualVM查看idea进程 发现其关于堆大小的参数设置如下 并发现随着idea加载项目 其实际使用的内存会自动增大 加载项目前和加载项目后 堆大小是不一样的 有一个大幅提升的阶段 随着所需要的内存的增多 虚拟机会多次向操作系统申

随机推荐

  • leetcode-283-移动零

    移动零 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 示例 输入 0 1 0 3 12 输出 1 3 12 0 0 说明 必须在原数组上操作 不能拷贝额外的数组 尽量减少操作次数 解法一 计算
  • STM32L4-RS485+DMA中断通信实验+字节丢失处理[寄存器版]

    基本设置 MCU采用 STM32L431RCT6 485芯片采用 ADM3485 采用串口经由RS485 使用DMA向串口调试助手传送数据 相关配置与前文基本相同 STM32L4 双路RS485自收发通信实验 寄存器版 staypt的博客
  • 我看鸿蒙操作系统

    华为宣布推出鸿蒙操作系统 其实我觉得能理解 但也蛮无奈的 所谓不得已而为之 google不提供后续版本授权 不提供新的支持 怎么办 硬着头皮也要上 有些自媒体说什么安卓慌了 google吓坏了 我真的想骂人 一群王八蛋为了点击率什么都敢写
  • 日志分析 入侵检测--实战

    收到客户服务器被入侵消息 希望我给他做一次入侵排查 刚做完顺手记录一下 入侵排查思路 0x01 日志分析 1 爆破ip统计 grep i Failed var log secure awk print NF 3 sort uniq c so
  • fgets()

    fgets 函数简介 读字符串函数fgets 的功能是从指定的文件中读一个字符串到字符数组中 函数调用的形式为 fgets 字符数组名 n 文件指针 要从键盘输入时文件指针的参数为 stdin 其中的n是一个正整数 表示从文件中读出的字符串
  • Springboot中创建拦截器

    目录 目的 实现过程 1 创建拦截器 2 注册拦截器 完整代码 目的 在Springboot项目中创建拦截器 在进入Controller层之前拦截请求 可对拦截到的请求内容做响应处理 如 校验请求参数 验证证书等操作 实现过程 1 创建拦截
  • PTS测试

    PTS性能测试 一 什么是性能测试 性能测试PTS Performance Testing Service 是一款简单易用 具备强大的分布式压测能力的SaaS压测平台 PTS可以模拟复杂的业务场景 并快速精准地调度不同规模的流量 同时提供压
  • JAVA中String及String常用的方法

    String string是表示字符串的字符串类 public class StringDemo public static void main String args 常见面试题 String s new String hello 问 如
  • Assuming drive cache: write through

    我也遇到过 关机重启就可以了
  • linux内存管理(十四)-内存OOM触发分析

    在内存分配路径上 当内存不足的时候会触发kswapd 或者内存规整 极端情况会触发OOM 来获取更多内存 在内存回收失败之后 会进行OOM OOM的入口是 alloc pages may oom 文件位于mm page alloc c中 s
  • 线代——基础解系 vs 特征向量

    基础解系 基础解系的概念是针对方程而言的 齐次线性方程组的解集的最大无关组称为齐次线性方程的基础解系 要求齐次线性方程组的通解 只需求出它的基础解系 例 特征向量 特征向量和特征值满足关系式 A A
  • 物理学家的Python

    特点 从基本的交互式 Python 开始 熟悉该语言 详细讨论了所有程序清单 介绍了 Matplotlib 图形 用于生成表示数据和函数图的图形 例如场线 考虑了动画函数图 有一章专门讨论代数方程和超越方程的数值解 讨论了基本的数学原理 并
  • 之前的一些笔记 py

    cmd清空 cls win e 打开我的电脑 好习惯 文件夹后面写数字表明软件的版本 怎么将2个分开的网页窗口合并成一个 鼠标按住一个窗口中的标签页不放 并向其它窗口的标题栏中拖动 即可把当前标签页合并到其它窗口中 注意 一定要按住标签页拖
  • 学习OpenCV——Surf(特征点篇)&flann

    Surf Speed Up Robust Feature Surf算法的原理 1 构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同 就是因为这些不同才加快了其检测的速度 Sift采用的是DOG图
  • 我的博客即将同步至腾讯云+社区

    我的博客即将同步至腾讯云 社区 邀请大家一同入驻
  • OpenGL笔记之矩阵变换(Matrix Transformation)

    OpenGL笔记之矩阵变换 Matrix Transformation 分类 OpenGL 2012 08 06 21 21 3968人阅读 评论 1 收藏 举报 transformation matrix math 图形 影视 本文是学习
  • nftqin网站登录参数s算法逆向

    原文转载自http www itfvck com 7488 html 抓包数据 method POST authority api nftqin com scheme https path api app passwordLogin con
  • java 代码静态检查_[原创]Java静态代码检查工具介绍

    原创 Java静态代码检查工具介绍 一 什么是静态代码检查 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算
  • 把win10系统迁移至ssd后,开机时电脑默认不会启动ssd里面系统的问题解决方法

    把win10系统迁移至ssd后 开机时电脑默认不会启动ssd里面系统的问题解决方法 电脑用了两三年了卡到不行 开机要两三分钟 刚开机后两三分钟内卡到都无法操作 于是乎 买了一块三星的860 evo的ssd 固态硬盘 打算对旧机升级一下 简单
  • elasticsearch之嵌套对象、父子文档

    一 嵌套对象 es并非关系型数据库 它并不擅长关系型数据库的join操作 在存储数据时 用冗余数据替代查询时的关联 如blog和comments 如果用关系型数据库 会将blog存一个表 comments存另一个表 然后将这两个表关联起来