ElasticSearch父子索引实战

在这里插入图片描述

关于父子索引

ES底层是Lucene,由于Lucene实际上是不支持嵌套类型的,所有文档都是以扁平的结构存储在Lucene中,ES对父子文档的支持,实际上也是采取了一种投机取巧的方式实现的.

父子文档均以独立的文档存入,然后添加关联关系,且父子文档必须在同一分片,由于父子类型文档并没有减少文档数量,而且增加了父子绑定关系,会导致查询效率低下,因此我们并不建议您在实际开发中使用父子类型.

ES本身更适合"大宽表"模式,不要带着传统关系型数据库那种思维方式去使用ES,我们完全可以通过把多张表中的字段和内容合并到一张表(一个索引)中,来完成期望功能,尽可能规避父子类型的使用,不仅效率高,功能也更强大。

建议

如果对文档的写多于读,那么建议你选择父子类型,如果文档读多于写, 那么请选择嵌套类型。

对比嵌套文档

父子文档在理解上来说,可以理解为一个关联查询,有些类似MySQL中的JOIN查询,通过某个字段关系来关联。
父子文档与嵌套文档主要的区别在于,父子文档的父对象和子对象都是独立的文档,而嵌套文档中都在同一个文档中存储。

父-子关系的主要优势有:

  • 更新父文档时,不会重新索引子文档。
  • 创建,修改或删除子文档时,不会影响父文档或其他子文档。这一点在这种场景下尤其有用:子文档数量较多,并且子文档创建和修改的频率高时。
  • 子文档可以作为搜索结果独立返回。

实战案例

本篇以博客文章和评论作为文档模型,演示文章和评论这个一对多的父子关系,增删改查如何操作。
假设数据如下:

[{"title":"这是一篇博文","content":"适当方式连接管理工具螺丝钉解放了送到房间里伺机待发..."},{"username":"Jack","comment":"nice post, good job!","date":"2023-09-04"},{"username":"王老五","comment":"写得很一般啊","date":"2023-08-04"},{"username":"技术我最牛","comment":"仅次于我","date":"2022-05-01"}
]

创建索引

创建blog索引,父文档与子文档分别用不同的字段来存储对应的数据,在创建索引文档的时需要指定父子文档的关系,即文章为parent,评论为child,创建索引语句如下:
在这里插入图片描述

{"mappings": {"properties": {"date": {"type": "date"},"username": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"comment": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"content": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"title": {"type": "text","fields": {"keyword": {"type": "keyword"}}},"relation": {"type": "join","relations": {"parent": "child"}}}}
}

添加文档

  • 父文档
    POST /blog/_doc/1
    在这里插入图片描述

如果不指定relation会报错:
在这里插入图片描述

  • 子文档
    子文档的插入语法如下,注意routing是父文档的id,平时我们插入文档时routing的默认就是id。

POST /blog/_doc/1?routing=1
在这里插入图片描述

查询文档

父子查询方式,常用分为两种特殊情况:

  • 根据子文档查询父文档 has_parent
    例如我要查询王老五的留言:

POST /blog/_search

{"query": {"has_child": {"type": "comment","query": {"match": {"username": "王老五"}}}}
}

在这里插入图片描述

  • 根据父文档查询子文档 has_child
    例如我要查询文章内容包含“工具”的所有评论:

POST /blog/_search
在这里插入图片描述

聚合查询与嵌套文档类似,比较简单,这里在说明另外一种场景:祖辈和孙辈可以创建吗?比如本文中的留言如果它也有子文档,那么可以根据文章查询孙辈吗?答案是可以的,只需要在has_child里面在嵌套一层has_child查询即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280092.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

木马后门实验

实验拓扑 实验步骤 防火墙 配置防火墙—充当边界NAT路由器 边界防火墙实现内部 DHCP 分配和边界NAT需求,其配置如下 登录网页 编辑接口 配置e0/0 配置e0/1 编辑策略 测试:内部主机能获得IP,且能与外部kali通信 kali 接下来开启 kali 虚…

Teamcenter用本地胖客户端启动时,可以看到插件的菜单项,但是用Eclipse启动时看不到

用本地胖客户端启动时,可以看到定制包的插件菜单项,但是用Eclipse启动时,看不到? 原因: 是因为Eclipse启动下,是采用 JAVA1.8 来运行的。但是本机的胖客户端是采用JAVA 11来运行的 解决办法:…

表现力丰富的肖像动画框架;结合本地LLM和GraphRAG的多代理RAG超级机器人;支持向量和图路径查询RAG;

✨ 1: Follow-Your-Emoji Follow-Your-Emoji 是一个基于扩散模型的精细控制与表现力丰富的肖像动画框架。 Follow-Your-Emoji 是一种基于扩散模型的肖像动画生成框架,可以通过目标标志序列动画化参考肖像。其核心优势在于能够实现精细可控和富有表现力的自由风格肖…

快速幂的求解方法(位运算)

需要求解幂运算的解法,可以将需要运算的内容进行判别,众所周知,幂就是指数,就是将底数乘以自身完成n次自相乘,那么就可以幻化为他的幂的简化计算; 以二进制为例,你要求,即可以看作是…

[CISCN2019 华北赛区 Day1 Web5]CyberPunk 1

目录 题目分析功能点分析伪协议读取源码search.phpchange.phpdelete.phpconfirm.php 代码分析 解法一解法二 题目分析 功能点分析 看到查询界面,第一时间想到了xss,经过测试存在xss,但没用 然后想到了sql注入,注册的时候在地址的…

nginx实战与负载均衡

一、nginx实战 1、nginx 反向代理配置 (1)概述 反向代理:⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)的资源。 (2)修改配置 [rootserver2 ~]# vim /usr/local/nginx/conf/ng…

学习日记:排序

目录 1.选择排序 2.冒泡排序 3.插入排序 4.查找 4.1 二分查找 1.选择排序 思想:给合适的位置选择合适的数(用后面的数依次跟指定位置上的数比较,如果后面的书比指定位置的数小,就交换两个数,依次重复,一…

API 接口自动化测试的基本原理及实战教程

常用API接口协议介绍 HTTP协议 超文本传输协议 它是用来在Internet上传送超文本的传送协议,运行在TCP/IP协议族之上,它可以使浏览器更加高效,使网络传输减少。 任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序&#xf…

(day28)leecode——有效括号

描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()","()(())","…

【Unity动画】Animation Sequencer:动画制作的革新工具

在Unity游戏开发中,动画是提升玩家体验的关键因素。传统的动画制作方式往往耗时且复杂,但有了Animation Sequencer,这一过程将变得更加直观和高效。本文将介绍Animation Sequencer这一视觉工具,探讨其如何帮助开发者在Unity编辑器…

案例分享-国外轻松感UI设计赏析

国外UI设计倾向于采用简洁的布局、清晰的排版和直观的交互方式,减少用户的认知负担,从而营造出轻松的使用体验。这种设计风格让用户能够快速找到所需信息,降低操作难度,提升整体满意度。 在注重美观的同时,更加重视用户…

技术详解:互联网医院系统源码与医保购药APP的整合开发策略

本篇文章,小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…

成为git砖家(9): git checkout <commit> <file> 的含义

文章目录 1. 目的2. 官方文档解释3. Tower 的解释4. References 1. 目的 git checkout 命令承载了非常多的功能&#xff0c; 想要一次全弄懂&#xff0c;不太现实&#xff1b; 这次白鱼带领大家学习 git checkout <file> 的用法。 老规矩&#xff0c;先查看 git checko…

DRAM的可靠性受什么因素影响

挑战 随着IC尺寸的不断减小&#xff0c;它们变得更容易受到多种环境因素的损害&#xff0c;尤其是对于放置在高温或低温且空气中含有微粒的恶劣环境中的系统。在远程维护受限的室外偏远地区设置的系统特别容易受到攻击。 IC质量不均。晶圆内的IC可能不一定具有相同的质量。一个…

PSINS工具箱函数介绍——kfinit0

【注】本文所述的函数kfinit0不同于kfinit&#xff0c;后者的讲解链接见&#xff1a;PSINS工具箱函数介绍——kfinit kfinit是kf的参数初始化函数&#xff0c;用于初始化滤波参数 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&…

金额转换题目

import java.util.Scanner;/*** author gyf* ClassName Test* Date 2024/7/30 17:51* Version V1.0* Description : 金额转换*/ public class Test {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int money;// 输入验证while (true) {Sys…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe)&#xff1a; 命名管道(FIFO)&#xff1a; 消息队列(MQ)&#xff1a; 信号量(semaphore)&#xff1a; 共享内存(shared memory)&#xff1a; 信号(signal)&#xff1a; 内存映射(mapped memory)&#xff1a; 内存映射和共享内存的区…

【论文共读】【翻译】【GAN】Generative Adversarial Nets

论文原文地址&#xff1a;https://arxiv.org/pdf/1406.2661 翻译&#xff1a;Generative Adversarial Nets 生成对抗网络 0. 摘要 提出了一种新的对抗过程估计生成模型的框架&#xff0c;其中我们同时训练两个模型&#xff1a;一个是捕获数据分布的生成模型G&#xff0c;另一…

RCE和php文件上传

一、远程命令执行&#xff08;RCE&#xff09; RCE漏洞概述 RCE漏洞允许攻击者通过某种方式在目标服务器上执行任意命令。这种漏洞通常出现在服务器端语言中&#xff0c;如PHP。 RCE漏洞原理 PHP中的一些函数可以执行命令或代码&#xff0c;但如果对这些函数的输入未加限制&a…

Docker容器下面home assistant忘记账号密码怎么重置?

环境&#xff1a; docker ha 问题描述&#xff1a; Docker容器下面home assistant忘记账号密码怎么重置&#xff1f; 解决方案&#xff1a; 你可以按照以下步骤来找回或重置密码&#xff1a; 方法一 (未解决) 停止并删除当前的Home Assistant容器&#xff08;确保你已经保…