谷粒商城实战笔记-129-商城业务-商品上架-nested数据类型场景

news2024/11/27 0:34:39

文章目录

      • 扁平化处理
        • 扁平化处理导致的检索问题
      • 解决方案:使用 nested 结构

在es的数据类型中有一个nested类型,本讲将重点讨论这个类型。

扁平化处理

PUT my_index/doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" : "Smith"
    },
    {
      "first" : "Alice",
      "last" : "White"
    }
  ]
}

在这里插入图片描述

如图所示,有一个名为 my_index 的索引,其中包含一个文档,该文档有一个名为 group 的字符串字段和一个名为 user 的数组字段,该数组包含两个对象。

首先看看如何在 Elasticsearch 中处理此数据,然后讨论如何解决扁平化处理带来的挑战。

默认情况下,Elasticsearch 将尝试将数组内的对象展平。在这种情况下,Elasticsearch 可能会将 user 数组展平为以下形式:

{
  "group": "fans",
  "user.first": ["John", "Alice"],
  "user.last": ["Smith", "White"]
}

然而,这种扁平化处理并不能很好地反映原始数据结构,因为它丢失了用户对象的上下文。

扁平化处理导致的检索问题

因此,我们在查询时会遇到下面的问题。

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"user.first": "Alice"}},
        {"match": {"user.last": "Smith"}}
      ]
    }
  }
}

在这里插入图片描述

在扁平化处理下,user 数组中的对象会被展平为单独的字段,例如 user.first 和 user.last。这意味着每个用户对象的属性都会被拆分为独立的字段,而不是作为一个整体存储。

在给定的查询中,要匹配一个 user 对象,其中 first 属性等于 “Alice”,last 属性等于 “Smith”。由于扁平化处理,user.first 和 user.last 字段分别包含 “John”、“Alice” 和 “Smith”、“White”,而不是完整的 “Alice Smith”。

在扁平化处理的情况下,这个查询可能会返回错误的结果,即使文档中不存在一个完整的 “Alice Smith” 用户。这是因为查询引擎会将 “Alice” 和 “Smith” 视为独立的关键词,而不是一个完整的姓名。因此,只要文档中存在一个 user.first 匹配 “Alice” 和一个 user.last 匹配 “Smith”,无论它们是否来自同一个用户对象,都会被视为匹配项。

对于上图中的查询,语义是要查找一个叫做“Alice Smith”的人,实际上并没有这样一个人,但是因为ES的扁平化处理,检索过程如下:

  • 首先会在user.first中查找Alice,能够匹配到一条记录
  • 接着在user.last中查找Smith,也能够匹配到

最后能查到两条记录,与预期不符。

解决方案:使用 nested 结构

为了避免这些问题,我们可以使用 nested 类型来存储 user 数组。以下是使用 nested 类型的映射定义:

PUT my_index
{
  "mappings": {
    "properties": {
      "group": { "type": "keyword" },
      "user": {
        "type": "nested",
        "properties": {
          "first": { "type": "keyword" },
          "last": { "type": "keyword" }
        }
      }
    }
  }
}

现在,我们可以将相同的数据插入到索引中,但这次使用 nested 结构:

PUT my_index/doc/1
{
  "group": "fans",
  "user": [
    { "first": "John", "last": "Smith" },
    { "first": "Alice", "last": "White" }
  ]
}

使用 nested 结构的好处在于,它可以保留数组中每个对象的完整结构。这意味着我们可以对 user 数组中的单个元素执行更复杂的查询,而不仅仅是简单的过滤。

例如,我们可以查询姓氏为 White 的用户:

GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "term": {
          "user.last.keyword": "White"
        }
      }
    }
  }
}

上述查询将返回所有包含至少一个姓氏为 White 的用户。

使用 nested 结构可以帮助我们更好地处理对象数组,特别是当我们需要执行更复杂的查询时。虽然 nested 结构可能会带来更高的存储成本和查询性能影响,但它提供了更大的灵活性和准确性。

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

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

相关文章

软件测试中APP上线测试的流程,湖南软件测评公司分享

在当今数字化高速发展的时代,移动应用(APP)的普及使得软件测试显得尤为重要。作为推动软件质量提升的重要环节,APP上线测试的流程决定了软件能否顺利进入市场。 APP上线测试并非一蹴而就,而是需要经过严格的分步流程。该流程包括需求分析、测…

工业5G路由器驱动矿山无人值守及井下监控数据传输

矿山行业作为国民经济发展的重要组成部分,其生产效率和安全性一直被广泛关注着。随着信息技术的飞速发展,矿山数字化转型已成为必然趋势。矿山井下环境复杂,传统的人工巡检和监控方式存在效率低、成本高、安全隐患大等问题。 由于户外矿山和…

前端项目发布到Nginx里报Failed to load module script错误

错误信息: Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec. 报错原因&…

Python3+selenium3

Python3selenium3 下载python3以上版本,链接:https://www.python.org/57 下载之后,直接安装,安装在C盘之外的磁盘环境变量 (1)安装完成后,看下这个目录D:\python\Scripts,有没pip.…

【大模型LLM面试合集】大语言模型架构_MoE经典论文简牍

2.MoE经典论文简牍 参考资料: MoE (Mixture-of-Experts) 经典文章简读Mixture-of-Experts (MoE) 经典论文一览 1.开创工作 1.1 Adaptive mixtures of local experts, Neural Computation’1991 期刊/会议:Neural Computation (1991)论文链接&#x…

pe节空白区添加的代码

再此之前需要了解节表(假设我们都理解了) 以一个程序为例: 如上图所示一个正长的程序运行后是这样的,我们想对该程序做点手脚,在弹出该页面之前,先弹出我们给他指定的东西。 最终实现结果: 首先弹出我们…

尚硅谷谷粒商城项目笔记——八、安装node.js【电脑CPU:AMD】

八、安装node.js 注: [!NOTE] 查看本机系统 官网选择node.js版本 1傻瓜式安装,注意选择路径 图一 图二 至此,nodejs安装完成! 2环境配置 找到安装nodejs的路径新增 node_global 和node_cache文件夹 创建完两个空文件夹&#x…

【学习总结】MySQL篇

MySql 事务ACID 原子性 事务是不可分割的最小单元,一个事务的若干sql操作。要么统一成功,要么统一失败。(redoLog) 持久性 数据库的数据在宕机,丢失数据的情况下。可以回滚数据,这由mysql的日志完成&a…

快讯 | Meta Llama 4模型:24万GPU打造,将于2025年登场!

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

标准IO——文件定位、文件IO

续:feof、ferror(检测一个流是否出错)、clearerr(清除一个流出错的标记)。 一、标准IO文件定位 1、fseek(定位) int fseek(FILE *stream , long offset(偏移长度) , int whence(偏移起始位置)) 其中when…

ROS 7上实现私网互通方案

一、背景: 第一个私网现状:连接公域网是由tp-link进行拨号链接使用动态公网ip,内部网段是192.168.1.0/24 第二个私网现状:连接公域网是机房的固定公网ip,内部网段为10.0.0.0/16二、目标 安全的打通192.168.1.0/24和10.0.0.0/16的网络, 使得前者局域网中的机器能够安全访…

全域运营系统质量对比:各大源码厂商搭建效能解析!

随着全域运营时代的到来,全域运营商的申请热度日渐上升,各大全域运营系统及其背后的源码厂商也因此备受关注。本期,小编将围绕全域运营系统的市场份额、搭建体系以及落地运营三个方面的内容,以帮助大家对各大源码厂商在全域运营系…

Probit 回归模型及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、稳健性检验 五、程序代码及解释 一、文献综述 Probit 回归模型作为一种重要的统计分析工具,在众多学科领域中发挥着关键作用,吸引了众多学者的深入研究和广泛应用。 在经济学领域,Probi…

python-打分(赛氪OJ)

[题目描述] 最近学校组织了校园歌手大赛,并且让全校师生为歌手评分(分数的范围为 1−100 分),但由于投票系统太过于落后,最后的计票中发现了如下几种票: - 分数大于 100 - 分数小于 1 - 一个最高分 - 一个最…

TOPIK韩语等级考试|韩语语法:被动词和使动词

韩语语法: 被动词与主动词 글쓰기 관련 강좌나 책에서 우리 문장을 쓸 때 웬만하면 피동형을 쓰지 말라는 주장을 흔히 접하게 된다. 능동형 동사를 사용하면 글이 늘어지지 않아 간결해지고 힘찬 문장이 되는 게 사실이다. 그러나 이 주장이 우리글에서 피동형 동…

IDEA自定义注释模版

1.类(接口/枚举等同理) 2.方法模版 先自定义一个模版组,然后在里面添加模版名,触发快捷键(Tab/Enter),模版描述,哪些语言中应用 模版中的自定义参数params和returns可以自动展开参数…

vue3.0学习笔记(五)——Vue3 状态管理 - Pinia

1. 什么是Pinia Pinia是Vue的最新状态管理工具,是Vuex的替代品。pinia官网:Pinia | The intuitive store for Vue.js 提供更加简单的API(去掉了mutation) 提供符合,组合式风格的API(和Vue3新语法统一&…

PhPMyadmin-漏洞复现

前情提要:首先将我们的PHP版本设置在5.5以上 一、通过⽇志⽂件拿Shell 1.搭建好环境后进行管理员登录 2.进入后点击SQL进行sql命令行操作 3.在输入框内输入set global general_logon; 将日志保存设置为开启状态 4.在输入 set global general_log_file 你要将日志…

未授权访问漏洞(非重点 中)

6.Hadoop 1.在 fofa 使用 port"8088" && app"Hadoop" 获取资源 2.打开后若无需登录,则存在漏洞 7.ActiveMQ 1.在 fofa 使用 body"ActiveMQ" && port"8161" 获取资源 2.打开后若点击登录,默认账户密码为 admin/adm…

无线领夹麦克风怎么挑选,2024年8月领夹麦挑选不踩雷攻略

在数字时代的浪潮中,每个人都可以成为自己故事的讲述者。从街头巷尾的Vlog达人,到专业演播室的主持人,再到远程教育的讲师,无线领夹麦克风正悄然改变着音频采集的方式。它不再局限于传统录音棚的束缚,而是融入了日常生…