Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

news2024/11/19 13:28:01

Elasticsearch实战—ES数据建模一对多模型Nested结构

文章目录

    • Elasticsearch实战---ES数据建模一对多模型Nested结构
      • 1.ES 一对多模型Nested 结构模型实战
      • 2.ES字段查询
        • 2.1 非Nested 错误结构及错误查询
        • 2.2 Nested结构,正确查询
      • 3.Nested结构原理

我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展

  1. 一对一 模型
  2. 一对多 模型
  3. 多对多 模型

上一篇,我们介绍了 一对多模型,采用Object对象存储的巨大缺陷,本篇文章,我们给出解决办法 就是采用Nested结构来存储数据, 但是Nested查询和读写需要有特定的语法,也就是一定程度上增加了读写的复杂性,但是数据的查询结果是正确的,所以说Nested 才是我们一对多 推荐的一种设计模型

1.ES 一对多模型Nested 结构模型实战

我们采用下面创建Index mapping结构,和上一篇大致一样的结构,把多个手机相同的分类信息,作为冗余字段 冗余到 手机基本信息中

差别就是 : 这次category字段,我们采用Nested结构,而不是Object结构,通过关键字 type:nested 来实现

索引库结构

PUT /phone_nested_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "productId": {
        "type": "long"
      },
      "productName": {
        "type": "keyword"
      },
      "productPrice": {
        "type": "long"
      },
      "productNumber": {
        "type": "long"
      },
      "category": {
        "type": "nested", 
        "properties": {
          "categoryName": {
            "type": "keyword"
          },
          "categoryRemark": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

同样的,插入数据, 下面我们给 phone_index 索引库插入数据, 插入 6条手机信息

put /phone_nested_index/_bulk
{"index":{"_id":1}}
{"productId":1,"productName":"P20","productPrice":4000,"productNumber":50,"category":{"categoryName":"华为手机","categoryRemark":"高端"}}
{"index":{"_id":2}}
{"productId":2,"productName":"Honor30","productPrice":2000,"productNumber":100,"category":[{"categoryName":"华为手机","categoryRemark":"很好"},{"categoryName":"荣耀手机","categoryRemark":"便宜"}]}
{"index":{"_id":3}}
{"productId":3,"productName":"小米8","productPrice":2000,"productNumber":600,"category":{"categoryName":"小米手机","categoryRemark":"中端"}}
{"index":{"_id":4}}
{"productId":4,"productName":"红米10","productPrice":2500,"productNumber":300,"category":{"categoryName":"小米手机","categoryRemark":"发烧"}}
{"index":{"_id":5}}
{"productId":5,"productName":"小米Max","productPrice":4000,"productNumber":800,"category":{"categoryName":"小米手机","categoryRemark":"很好"}}

2.ES字段查询

我们要查询 华为手机 便宜的 标签,must 查询, 分类:华为手机,描述:便宜

Nested结构查询,需要特定的语法,需要加上查询路径,我们的就是 path:category 信息

2.1 非Nested 错误结构及错误查询

老的结构 非Nested phone_index 数据

get /phone_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "category.categoryName": "华为手机"
          }
        },
        {
          "match": {
            "category.categoryRemark": "便宜"
          }
        }
      ]
    }
  }
}

查询结果 不是我们想要的, 是错误的
在这里插入图片描述

或者 我们再查询以下 华为手机-发烧的 场景, 按照我们的数据, 不存在任何数据把华为手机和发烧关联

must查询, 分类:华为手机, 标签:发烧

get /phone_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "category.categoryName": "华为手机"
          }
        },
        {
          "match": {
            "category.categoryRemark": "发烧"
          }
        }
      ]
    }
  }
}

查询结果错误, 要查询 华为手机-发烧的数据,结果把 小米手机查询出来了,这是明显的错误
在这里插入图片描述

2.2 Nested结构,正确查询

同样,我们采用Nested结构查询, 查询华为手机 且便宜的 信息
Nested结构查询,需要带上查询条件 path路径信息 “nested”: {“path”: “category”}

get /phone_nested_index/_search
{
  "query": {
    "nested": {
      "path": "category",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "category.categoryName": "华为手机"
              }
            },
            {
              "match": {
                "category.categoryRemark": "便宜"
              }
            }
          ]
        }
      }
    }
  }
}

查询结果, 符合预期,并没有查询出 错误的结果, 查询结果为空
在这里插入图片描述
现在我们来查以下另一种场景, 华为手机-发烧 的查询语句,看看是否能够正确查询

get /phone_nested_index/_search
{
  "query": {
    "nested": {
      "path": "category",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "category.categoryName": "华为手机"
              }
            },
            {
              "match": {
                "category.categoryRemark": "发烧"
              }
            }
          ]
        }
      }
    }
  }
}

同样的结果,查询结果没有数据, 也是符合我们预期的,是正确的查询结果
在这里插入图片描述

3.Nested结构原理

上面我们验证了采用Nested 结构,可以有效的解决 object对象存储, 错误的查询方式这种缺陷,那么原理是什么呢?

官方定义:官方释义:

  • nested属于object类型的一种,是Elasticsearch中用于复杂类型对象数组的索引操作。Elasticsearch没有内部对象的概念
  • ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表,
  • 说明白点就是 把搜索条件指定到一个独立Object对象中,把搜索的条件指定到数组中某一个特定 object 数据中, 而不是分散在整个数组中
  • 虽然读写操作复杂了,但是 查询结果是正确的,这是我们一对多 推荐的一种设计模型

这样就可以解决Object对象存储的问题

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

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

相关文章

vue 中使用 vxe-table 制作可编辑表格

项目上有一个表格需要实现在线编辑,开始用了 element 的el-table 实现,单元格内基础情况就是监听了单击单元格切换一个span标签与input标签,复杂点的单元格使用了大量的条件判断来实现对应的编辑操作,比如下拉选,popov…

github Couldn‘t connect to server

Couldnt connect to server 问题描述解决git clone 出错直接访问github没啥问题ping github.com手动指定域名映射关系再次测试git命令 总结参考 问题描述 前一天还是好好的,能git pull和git push,昨天回来之后怎么操作都是Couldnt connect to server。百…

【数据结构】堆的实现(向下调整和向上调整法)和堆排序的实现

目录 一、堆的概念引入 二、小堆的实现 首先,我们会跟线性表一样建立一个动态数组来存堆的数据 ①、堆的初始化--HeapInit ②、小堆的向下调整法的实现 ③、堆排序的实现 ④、堆的插入和向上调整法 ⑤、删除堆顶数据 ⑥、获取堆顶 三、时间复杂度总结&#…

C# PaddleInference OCR识别 学习研究Demo

说明 基于开源项目 https://github.com/sdcb/PaddleSharp VS2022.net4.8 OpenCvSharp4Sdcb.PaddleInference 效果 项目 代码 using Sdcb.PaddleInference.Native; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using OpenCvSharp.Extensi…

15年前的手机并没有jvm虚拟机,为何可以运行Java游戏

2000年代初期,随着移动通信技术的发展,手机逐渐普及。那个时代的手机功能相对比较单一,主要用于打电话和发送短信。但是,随着技术的进步,人们开始在手机上玩游戏,而其中最受欢迎的游戏就是Java游戏。在那个…

ChatLaw,开源了!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 最近这段时间,AI 的整体热度有所下降,但是 AI 技术在各行各业的探索脚步,却一直没有停止。 在 ChatGPT 刚发布时,有不少业内人士认为&#x…

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别 以前不太注意这些,最近搞文档比较多才发现为何保存的一部分PDF文件里面字体可以复制可以搜索,一部分保存的PDF里面的字体却无法复制、无法搜索等,发现是不同保存方式得到的文档权限不一…

SQL注入攻击原理 实战

我来进行实战了,总在看教程。 文章目录 前言一,网站是否存在sql漏洞二、判断一下字段3. 判断显点4.查找相关信息1.查询数据库2.版本3.数据库表名4.字段名5,查询 总结 前言 提示:这里可以添加本文要记录的大概内容: 前言&#xff…

华为OD机试真题 Python 实现【学校的位置】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 为了解决新学期学生暴涨的问题,小乐村要建所新学校。考虑到学生上学安全问题,需要所有学生家到学校距离最短。假设学校和所有的学生家&am…

unity+pico neo3入门教程1-基础传送

tips:之前入门教程如果没有左手柄,查看一下自己的手柄设置,左右手柄, Helloworld型 1.基础传送,调式地面传送功能,通过手柄默认的“握手键”,瞬移, VR头显,添加Teleport…

Go语言远程调试

Go语言远程调试 1、安装dlv # 安装dlv $ go install github.com/go-delve/delve/cmd/dlvlatest$ dlv version Delve Debugger Version: 1.20.1 Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e $2、命令行远程调试 我们远程(Linux服务器)有如下代码: [ro…

(四)Kafka 消费者

文章目录 1. Kafka 消费者相关概念消费者和消费者组(1)横向伸缩消费者(2)横向伸缩消费者组 分区再平衡再均衡的类型(1)主动再均衡(2)协作再均衡(增量再均衡) …

MyBatisAnnotationSqlInjection.ql学习

源码位置 java\ql\src\experimental\Security\CWE\CWE-089 源代码 /*** name SQL injection in MyBatis annotation* description Constructing a dynamic SQL statement with input that comes from an* untrusted source could allow an attacker to modify …

【UE5 Cesium】14-Cesium for Unreal 加载服务器上的倾斜摄影

目录 前言 步骤 一、下载安装tomcat 10 二、下载安装JDK 三、启动Tomcat 四、Tomcat加载倾斜摄影 五、UE中加载Tomcat上的倾斜摄影 前言 上一篇文章(【UE5 Cesium】13-Cesium for Unreal 加载本地倾斜摄影)介绍了如何在UE中加载本地倾斜摄影&am…

链表专题1—24. 两两交换链表中的节点 234.回文链表 143.重排链表 141.环形链表 142.环形链表II 160.链表相交 C++实现

文章目录 24. 两两交换链表中的节点234.回文链表链表转数组统计长度反转后半部分链表 快慢指针 143. 重排链表数组 双指针 超时双队列反转和插入链表 141. 环形链表142.环形链表II160.链表相交 24. 两两交换链表中的节点 迭代法,时间复杂度: O ( n ) O(n…

App store里简单好用的便签app有哪些?

作为一个打工人,我经常需要一个简单而又好用的便签应用来记录我的各种事务和备忘。我曾在App Store里尝试了许多便签应用,但有一款应用真正让我留下了深刻的印象——敬业签。 敬业签的简单和易用性让我爱不释手。无论是添加新的便签,设置提醒…

基础大模型能像人类一样标注数据吗?

自从 ChatGPT 出现以来,我们见证了大语言模型 (LLM) 领域前所未有的发展,尤其是对话类模型,经过微调以后可以根据给出的提示语 (prompt) 来完成相关要求和命令。然而,直到如今我们也无法对比这些大模型的性能,因为缺乏…

为什么程序员更容易抑郁?是因为...

【1】 前段时间,有一位朋友,在后台留言: 《谢谢你听我吐槽,说出来感觉好了很多》 这位程序员朋友在深圳大厂,35岁,10年研发经验,倍感抑郁,吐露了自己的近况: &#xff08…

IDE /skipping incompatible xxx_d.dll when searching for -lxxx_d

文章目录 概述场景复现用以测试的代码编译器位数不匹配导致?保持编译器类型一致再验证编译器位数的影响MingW下调用OS的库咋不告警?以mingW下使用winSocket为例MingW下网络编程的头文件分析该环境下链接的ws2_32库文件在哪里?mingW为啥可以兼容window下的动态库 概…

MySQL自治平台建设的内核原理及实践(下)

总第566篇 2023年 第018篇 本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第4篇文章。 本文作者在演讲后根据同学们的反馈,补充了很多技术细节&…