ElasticSearch-关联关系

  • Elasticsearch并不擅长处理关联关系,一般会采用以下四种方法处理关联
    • 对象类型
    • 嵌套对象 (Nested Object)
    • 父子关联关系 (Parent / Child)
    • 应用端关联

对象类型

  • 在每一博客的文档中都保留作者的信息
    • 如果作者信息发生变化,需要修改相关的博客文档
  • 包含对象数组的文档
    • 可能会搜到不需要的结果
      • 存储时,内部对象的边界并没有考虑在内,JSON格式被处理成扁平式键值对的结构
      • 当对多个字段进行查询时,导致意外的搜索结果
      • 可以用 Nested Data Type 解决这个问题
POST /my_movies/_doc/1 
{"title":"Speed","actors":[{"first_name":"Keanu","last_name":"Reeves"},{"first_name":"Dennis","last_name":"Hopper"}]}
# 会搜到不需要的结果,因为 JSON 格式被处理成扁平式键值对的结构
POST /my_movies/_search
{"query":{"bool":{"must":[{"match":{"actors.first_name":"Keanu"}}, {"match":{"actors.last_name":"Hopper"}}]}}}

嵌套对象 (Nested Object)

  • Nested Data Type
    • Nested数据类型: 允许对象数组中的对象被独立索引
    • 使用nested 和properties 关键字,将所有actors索引到多个分隔的文档
    • 在内部, Nested文档会被保存在两个Lucene文档中,在查询时做Join处理
# 创建 Nested 对象 Mapping
PUT /my_movies
{"mappings":{"properties":{"actors":{"type":"nested","properties":{"first_name":{"type":"keyword"},"last_name":{"type":"keyword"}}},"title":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}
POST /my_movies/_doc/1 
{"title":"Speed","actors":[{"first_name":"Keanu","last_name":"Reeves"},{"first_name":"Dennis","last_name":"Hopper"}]}
# Nested 查询
POST /my_movies/_search
{"query":{"bool":{"must":[{"match":{"title": "Speed"}}, {"nested":{"path":"actors","query":{"bool":{"must":[{"match":{"actors.first_name":"Keanu"}},{"match":{"actors.last_name":"Hopper"}}]}}}}]}}}
# Nested Aggregation
POST /my_movies/_search
{"size":0,"aggs":{"actors":{"nested":{"path":"actors"},"aggs":{"actor_name":{"terms":{"field":"actors.first_name","size":10}}}}}}
# 普通 aggregation 不工作
POST /my_movies/_search
{"size":0,"aggs":{"NAME":{"terms":{"field":"actors.first_name","size":10}}}}

父子关联关系 (Parent / Child)

  • 对象和Nested对象的局限性: 每次更新,可能需要重新索引整个对象 (包括根对象和嵌套对象)
  • ES提供了类似关系型数据库中Join 的实现
    • 使用Join数据类型实现,可以通过维护Parent/ Child的关系,从而分离两个对象
  • 父文档和子文档是两个独立的文档
  • 更新父文档无需重新索引子文档
  • 子文档被添加,更新或者删除也不会影响到父文档和其他的子文档
  • 注意
    • 父文档和子文档必须存在相同的分片上,能够确保查询 join 的性能
    • 当指定子文档时候,必须指定它的父文档ld。使用routing参数来保证,分配到相同的分片
# 设定 Parent/Child Mapping
PUT /my_blogs
{"settings":{"number_of_shards":2},"mappings":{"properties":{"blog_comments_relation":{"relations":{"blog":"comment"},"type":"join"},"content":{"type":"text"},"title":{"type":"keyword"}}}}
# 索引父文档
PUT /my_blogs/_doc/blog1
{"title":"Learning Elasticsearch", "content":"learning ELK ","blog_comments_relation":{"name":"blog"}}
# 索引子文档
PUT /my_blogs/_doc/comment1?routing=blog1 
{"comment":"I am learning ELK","username":"Jack","blog_comments_relation":{"name":"comment","parent":"blog1"}}
# Parent Id 查询
POST /my_blogs/_search 
{"query":{"parent_id":{"type":"comment","id":"blog2"}}}
# Has Child 查询, 返回父文档 
POST /my_blogs/_search
{"query":{"has_child":{"type":"comment","query":{"match":{"username":"Jack"}}}}}
# Has Parent 查询, 返回相关的子文档 
POST /my_blogs/_search
{"query":{"has_parent":{"parent_type":"blog","query":{"match":{"title":"Learning Hadoop"}}}}}
# 通过 ID, 访问子文档
GET /my_blogs/_doc/comment3
# 通过 ID 和 routing, 访问子文档
GET /my_blogs/_doc/comment3?routing=blog2
# 更新子文档
PUT /my_blogs/_doc/comment3?routing=blog2 
{"comment":"Hello Hadoop??","blog_comments_relation":{"name":"comment","parent":"blog2"}}

嵌套文档 VS 父子文档

Nested ObjectParent / Child
优点文档存储在一起,读取性能高父子文档可以独立更新
缺点更新嵌套的子文档时,需要更新整个文档需要额外的内存维护关系,读取性能相对差
适用场景子文档偶尔更新,以查询为主子文档更新频繁

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot依赖之Spring Boot DevTools热部署开发增效工具

摘要:Spring项目又大又重,依赖多,编译启动慢,怎么提高研发效率呢?方法之一热部署! 概念 Spring Boot DevTools 依赖名称: Spring Boot DevTools功能描述: Provides fast application restarts, LiveRelo…

softmax里边的exp用拟合验证精度。

文章目录 要验证Softmax函数中的指数运算(exp函数)对精度的影响,可以通过拟合一个函数来近似Softmax函数,并比较两者的输出结果。 import numpy as np import matplotlib.pyplot as plt# Softmax函数 def softmax(x):e_x np.exp…

25k的自动化测试面试题,原来都是这样~

小编热衷于收集整理资源,记录踩坑到爬坑的过程。希望能把自己所学,实际工作中使用的技术、学习方法、心得及踩过的一些坑,记录下来。也希望想做软件测试的你一样,通过我的分享可以少走一些弯路,可以形成一套自己的方法…

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容,吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容,这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式,AI绘画助力引流和赚钱: &#xf…

数学基础 -- 线性代数之伴随矩阵

伴随矩阵 1. 代数余子式 首先我们需要理解什么是代数余子式。对于一个 n n n \times n nn 的方阵 A A A,代数余子式 M i j M_{ij} Mij​ 是指从矩阵 A A A 中删除第 i i i 行和第 j j j 列后,剩下的子矩阵的行列式。 假设有一个 3 3 3 \time…

【软件】软件评审

目录 1. 说明2. 设计质量的评审内容3. 程序质量的评审内容3.1 软件结构3.2 功能的通用性3.3 模块的层次3.4 模块结构3.4 处理过程的结构 4. 与运行环境的接口5. 例题5.1 例题1 1. 说明 1.通常,把“质量”理解为“用户满意程度”。为了使得用户满意,有两…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

SpringBoot+Vue实现大文件上传(断点续传-后端控制(一))

SpringBootVue实现大文件上传(断点续传) 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI,spark-md5 2 问题 在前一篇文章,我们写了通过在前端控制的断点续传,但是有两个问题,第一个问题&…

铁打的程序员轻易“不哭”-我的大模型创业近2年来的感悟

楔子 2022年11月,GPT-3发布那一刻,我被AI的强大能力所震撼,意识到“超级个体”时代的来临。自那时起,我开始全心投入创业,经历了许多苦乐交织的时光。 2023年6月,我尝试将AI应用于智能营销导购&#xff0…

云原生架构概念

云原生架构概念 云原生架构(Cloud Native Architechtrue)作为一种现代软件开发的革新力量,正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构,使得应用程序能够分解为独立、松耦合的服务&#xf…

window系统怎么设置闹钟提醒?分享一个桌面提醒设置办法

在日常工作和生活中,我们常常会因忙碌而遗忘一些重要事项。对于很多使用电脑办公的用户来说,如果能在桌面上设置闹钟提醒,无疑会大大提高工作效率,减少遗漏。那么,如何设置这样的闹钟提醒呢? 这时&#xf…

ElementUI实现el-table组件的合并行功能

前言 有时遇到一些需求,需要实现ElementUI中,el-tabled组件合并单元格的功能,稍微了解一下它的数据格式,不难可以写出比合并方法。但是在鼠标经过单元行时,会出现高亮的行与鼠标经过的行不一致的BUG。因此还需要实现c…

UniApp 中页面跳转的方法及传值

一、UniApp 中页面跳转的方法及特点 (一)常见的页面跳转方法 uni.navigateTo: 用途:用于跳转到应用内的某个页面,非 tabBar 页面,它会保留当前页面,打开新的页面并推入页面栈中。特点&#xf…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

无线麦克风哪个牌子的好,麦克风哪个好,无线麦克风品牌推荐

​在自媒体日益繁荣的当下&#xff0c;内容创作成为了许多人追求的目标。对于视频内容创作者而言&#xff0c;出色的内容是成功的基石&#xff0c;而高质量的设备则是保证作品品质的关键。为了提升视频音质&#xff0c;拥有一款专业的无线麦克风是不可或缺的。 然而&#xff0…

PHP智能匹配轻松预订自习室在线订座系统小程序源码

智能匹配&#xff0c;轻松预订——自习室在线订座系统 &#x1f4da;【开篇&#xff1a;告别排队&#xff0c;迎接智能学习新时代】&#x1f4da; 还在为找不到合适的自习室座位而烦恼吗&#xff1f;是不是每次去图书馆或自习室都要提前好久去排队占位&#xff1f;现在&#…

Python教程:面向对象

模块3&#xff1a;Python高级 模块概述 本课程旨在介绍Python编程语言中的面向对象编程&#xff08;OOP&#xff09;概念和技术。学生将学习如何使用类、对象、继承、多态等OOP的关键要素来构建灵活、可重用和可扩展的代码。通过实际编程练习和项目&#xff0c;学生将提高他们…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…

AWS-亚马逊网络服务(基础服务)-AWS 定价计算器-概述与动手部署:

让我们来概述并亲身实践如何使用 AWS 定价计算器来计算 概述&#xff1a; AWS 定价计算器是 Amazon Web Services (AWS) 提供的基于 Web 的工具&#xff0c;可帮助用户估算其特定用例的 AWS 服务成本。欢迎来到雲闪世界。 它允许客户建模他们的基础设施并根据他们打算使用的…

Android 9.0 增加interface audio接口,解决编译报错

最近修改Android接口&#xff0c;报了一个VNDK的错误 我总结了如下几种方式&#xff1a; 1、直接关闭&#xff08;不推荐&#xff09;&#xff1a; 在BoardConfig.mk中加入如下两行&#xff0c;可以在编译的时候不去check VNDK&#xff0c;关掉这个可能会导致XTS某些测项跑不…