当前位置: 首页 > news >正文

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

文章目录

      • 扁平化处理
        • 扁平化处理导致的检索问题
      • 解决方案:使用 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 结构可能会带来更高的存储成本和查询性能影响,但它提供了更大的灵活性和准确性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 用Java构建简单ATM系统
  • 白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理
  • 基于深度学习的大规模模型训练
  • 无代码开发AI服务 - 利用向量库Kendra和Llama大模型在亚马逊云科技AWS上创建RAG知识库
  • 基于Qt的视频剪辑
  • informer中的WorkQueue机制的实现分析与源码解读(1)
  • Netty的几种IO模式的实现与切换
  • Flask基础教程(第一阶段)
  • JAVA—面向对象编程高级
  • 《死侍与金刚狼》票房飘红! 目前全球票房总票房$7亿,预计可达$12亿,全球排名跃居第二!
  • 数据集相关类代码回顾理解 | sns.distplot\%matplotlib inline\sns.scatterplot
  • 【redis 第八篇章】链表结构
  • 新增道路查询后的最短距离
  • YOLOv8添加注意力模块并测试和训练
  • 【VS Code】launch.json与tasks.json
  • 【Leetcode】104. 二叉树的最大深度
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript设计模式之工厂模式
  • JAVA并发编程--1.基础概念
  • Spring框架之我见(三)——IOC、AOP
  • 翻译--Thinking in React
  • 简单数学运算程序(不定期更新)
  • 精彩代码 vue.js
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 力扣(LeetCode)357
  • 深度学习中的信息论知识详解
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 我从编程教室毕业
  • 转载:[译] 内容加速黑科技趣谈
  • Spring Batch JSON 支持
  • 从如何停掉 Promise 链说起
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #include<初见C语言之指针(5)>
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (9)STL算法之逆转旋转
  • (zhuan) 一些RL的文献(及笔记)
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (十)Flink Table API 和 SQL 基本概念
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .form文件_一篇文章学会文件上传
  • .Mobi域名介绍
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 的缓存方案
  • .net framework profiles /.net framework 配置
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 使窗口永不获得焦点
  • .net下简单快捷的数值高低位切换
  • .NET业务框架的构建
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually