热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch数据建模是什么?

1、数据建模是什么数据模型是描述现实世界某种现象或者状态的物理抽象,比如我们之前用FSA

1、数据建模是什么

数据模型是描述现实世界某种现象或者状态的物理抽象,比如我们之前用FSA
来描述罗老师的一天
这种现象,就是把现实世界抽象成某种模型。现实世界有很多重要的关联关系:博客帖子有一些评论,银行账户有多次交易记录,客户有多个银行账户,订单有多个订单明细,文件目录有多个文件和子目录。

关系型数据库关联关系:

每个实体(或 行 ,在关系世界中)可以被主键
唯一标识。
实体规范化
(范式)。唯一实体的数据只存储一次,而相关实体只存储它的主键。只能在一个具体位置修改这个实体的数据。
实体可以进行关联查询,可以跨实体搜索。单个实体的变化是原子性
一致性
隔离性
, 和持久性
大多数关系数据库支持跨多个实体的 ACID 事务。

但是关系型数据库有其局限性,包括对全文检索有限的支持能力。实体关联查询时间消耗是很昂贵的,关联的越多,消耗就越昂贵。特别是跨服务器进行实体关联时成本极其昂贵,基本不可用。但单个的服务器上又存在数据量的限制。

Elasticsearch ,和大多数 NoSQL 数据库类似,是扁平化的。索引是独立文档的集合体。文档是否匹配搜索请求取决于它是否包含所有的所需信息。

Elasticsearch 中单个文档的数据变更是 ACIDic 的, 而涉及多个文档的事务则不是。当一个事务部分失败时,无法回滚索引数据到前一个状态。

扁平化有以下优势:

索引过程是快速和无锁的。搜索过程是快速和无锁的。因为每个文档相互都是独立的,大规模数据可以在多个节点上进行分布。

但关联关系仍然非常重要。某些时候,我们需要缩小扁平化和现实世界关系模型的差异。以下四种常用的方法,用来在 Elasticsearch 中进行关系型数据的管理:

Application-side joinsData denormalizationNested objectsParent/child relationships

数据模型是描述某些现象或者逻辑的物理抽象,在Java开发中常见的一种领域 模型的概念:POJO


2、对象和实体

对象和实体的关系就是现实世界和数据模型的映射,我们在做Java开发的时候经常用到的POJO的领域模型就是这种关系:

分层领域模型规约:

DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。BO( Business Object):业务对象。由Service层输出的封装业务逻辑的对象。AO( Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

领域模型命名规约:

数据对象:xxxDO,xxx即为数据表名。数据传输对象:xxxDTO,xxx为业务领域相关的名称。展示对象:xxxVO,xxx一般为网页名称。POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

3、数据建模的过程

概念:需求 => 抽象。即把实际的用户需求抽象为某种数据模型,比如我们在存储倒排表
的时候,就是把”储存倒排表“这个需求抽象成FST
的这种抽象的数据模型。
逻辑:抽象 => 具体。仍然以”存储倒排表“为例,FST模型构建完成之后,我们需要把其抽象变成具体的代码和对象,把实现变为肉眼可见的东西。物理:具体 => 落地。同上,当我们有了逻辑之后,就可以通过具体的对象、属性变成实实在在的数据文件,保存在你的磁盘里。

4、建模意义

我个人总结如下,但其实不仅限于以下几点:

开发:简化开发流程,从而提高效率产品:提升数据的存储效率,提升查询性能管理:前期准备充分,降低后期出现问题的可能性成本:综合各个因素,降低整体的运营和管理成本

5、数据建模的包含的内容

关联关系处理(index relations):

数据模型的关联:我们通过在我们的应用程序中实现联接可以(部分)模拟关系数据库。应用层联接的主要优点是可以对数据进行标准化处理。只能在 user
 文档中修改用户的名称。缺点是,为了在搜索时联接文档,必须运行额外的查询

非规范化数据:使用 Elasticsearch 得到最好的搜索性能的方法是有目的的通过在索引时进行非规范化 denormalizing。对每个文档保持一定数量的冗余副本可以在需要访问时避免进行关联

稀疏字段:避免稀疏字段文档,如以下情况应尽量避免:

并发问题:全局锁、文档锁、树锁(独占锁、共享锁)、乐观锁、悲观锁

Object类型:通俗点就是通过字段冗余,以一张大宽表来实现粗粒度的index,这样可以充分发挥扁平化的优势。但是这是以牺牲索引性能及灵活度为代价的。使用的前提:冗余的字段应该是很少改变的;比较适合与一对少量关系的处理。当业务数据库并非采用非规范化设计时,这时要将数据同步到作为二级索引库的ES中,就很难使用上述增量同步方案,必须进行定制化开发,基于特定业务进行应用开发来处理join关联和实体拼接

嵌套对象:索引性能和查询性能二者不可兼得,必须进行取舍。嵌套文档将实体关系嵌套组合在单文档内部(类似于json的一对多层级结构),这种方式牺牲索引性能(文档内任一属性变化都需要重新索引该文档)来换取查询性能,可以同时返回关系实体,比较适合于一对少量的关系处理。当使用嵌套文档时,使用通用的查询方式是无法访问到的,必须使用合适的查询方式(nested query、nested filter、nested facet等),很多场景下,使用嵌套文档的复杂度在于索引阶段对关联关系的组织拼装

父子级关系:父子文档牺牲了一定的查询性能来换取索引性能,适用于一对多的关系处理。其通过两种type的文档来表示父子实体,父子文档的索引是独立的。父-子文档ID映射存储在 Doc Values 中。当映射完全在内存中时, Doc Values 提供对映射的快速处理能力,另一方面当映射非常大时,可以通过溢出到磁盘提供足够的扩展能力。在查询parent-child替代方案时,发现了一种filter-terms的语法,要求某一字段里有关联实体的ID列表。基本的原理是在terms的时候,对于多项取值,如果在另外的index或者type里已知主键id的情况下,某一字段有这些值,可以直接嵌套查询。具体可参考官方文档的示例:通过用户里的粉丝关系,微博和用户的关系,来查询某个用户的粉丝发表的微博列表。

扩展性

分片分配感知索引模板索引生命周期冷热架构分片管理和规划滚动索引和别名跨集群搜索

6、Object、Nested、Join

6.1 嵌套类型:Nested

nested属于object类型的一种,是Elasticsearch中用于复杂类型对象数组的索引操作。Elasticsearch没有内部对象的概念,因此,ES在存储复杂类型的时候会把对象的复杂层次结果扁平化为一个键值对列表。

比如

    PUT my-index-000001/_doc/1
    {
    "group" : "fans",
    "user" : [
    {
    "first" : "John",
    "last" : "Smith"
    },
    {
    "first" : "Alice",
    "last" : "White"
    }
    ]
    }

    上面的文档被创建之后,user数组中的每个json对象会以下面的形式存储

      {
      "group" : "fans",
      "user.first" : [ "alice", "john" ],
      "user.last" : [ "smith", "white" ]
      }

      user.first
      user.last
      字段被扁平化为多值字段,first
      last
      之间的关联丢失。

      使用nested为复杂类型创建mapping:

        PUT
        {
        "mappings": {
        "properties": {
        "": {
        "type": "nested"
        }
        }
        }
        }

        查询

          GET /_search
          {
          "query": {
          "nested": {
          "path": "",
          "query": {
          ...
          }
          }
          }
          }

          Optins:

          path:nested对象的查询深度score_mode:评分计算方式avg (默认):使用所有匹配的子对象的平均相关性得分。max:使用所有匹配的子对象中的最高相关性得分。min:使用所有匹配的子对象中最低的相关性得分。none:不要使用匹配的子对象的相关性分数。该查询为父文档分配得分为0。sum:将所有匹配的子对象的相关性得分相加。

          6.2 父子级关系:Join

          连接数据类型是一个特殊字段,它在同一索引的文档中创建父/子关系。关系部分在文档中定义了一组可能的关系,每个关系是一个父名和一个子名。父/子关系可以定义如下

            PUT
            {
            "mappings": {
            "properties": {
            "": {
            "type": "join",
            "relations": {
            "": ""
            }
            }
            }
            }
            }

            使用场景

            join
            类型不能像关系数据库中的表链接那样去用,不论是has_child
            或者是has_parent
            查询都会对索引的查询性能有严重的负面影响。并且会触发global ordinals

            join
            唯一合适应用场景是:当索引数据包含一对多的关系,并且其中一个实体的数量远远超过另一个的时候。比如:老师
            一万个学生

            注意

            在索引父子级关系数据的时候必须传入routing参数,即指定把数据存入哪个分片,因为父文档和子文档必须在同一个分片上,因此,在获取、删除或更新子文档时需要提供相同的路由值。每个索引只允许有一个join
            类型的字段映射
            一个元素可以有多个子元素但只有一个父元素可以向现有连接字段添加新关系也可以向现有元素添加子元素,但前提是该元素已经是父元素

            觉得内容还不错的话,给我点个“在看”呗

            ▲ 已培养近百位 Elastic认证工程师 还不关注下?

            ♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩
            ♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩

            点击蓝字关注我们

            ♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩
            ♫. ♪ ~ ♬..♩~ ♫. ♪..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩..♩~ ♫. ♪ ~ ♬..♩ 


            推荐阅读
            • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
            • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
            • Nginx使用AWStats日志分析的步骤及注意事项
              本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
            • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
            • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
            • Linux重启网络命令实例及关机和重启示例教程
              本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
            • Java实战之电影在线观看系统的实现
              本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
            • 开发笔记:加密&json&StringIO模块&BytesIO模块
              篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
            • android listview OnItemClickListener失效原因
              最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
            • 如何使用Java获取服务器硬件信息和磁盘负载率
              本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
            • Spring特性实现接口多类的动态调用详解
              本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
            • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
            • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
            • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
            • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
            author-avatar
            蒋军利
            这个家伙很懒,什么也没留下!
            PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
            Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有