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

Elasticsearch之数据建模

数据建模英文为DataModeling,为创建数据模型的过程数据模型(DataModel)-对现实世界进行抽象描述的一种工具和方法-通过

数据建模


  • 英文为 Data Modeling, 为创建数据模型的过程
  • 数据模型(Data Model)
    - 对现实世界进行抽象描述的一种工具和方法
    - 通过抽象的实体及实体之间联系的形式去描述业务规则,从而实现对现实世界的映射

数据建模的过程


  • 概念模型
    - 确定系统的核心需求和范围边界,设计实体和实体间的关系
  • 逻辑模型
    - 进一步梳理业务需求,确定每个实体的属性、关系和约束等
  • 物理模型
    - 结合具体的数据库产品,在满足业务读写性能需求的前提下确定最终的定义
    - Mysql、MongoDB、elasticsearch等
    - 第三范式

数据建模的意义

在这里插入图片描述


ES中的数据建模


  • ES 是基于 Lucene 以倒排索引为基础实现的存储体系,不遵循关系型数据库中的范式预定
    在这里插入图片描述

Mapping 字段的相关设置


enbaled


  • true | false
  • 仅存储,不做搜索或聚合分析

index


  • true | false
  • 是否构建倒排索引

index_option


  • docs | freqs | positions | offsets
  • 存储倒排索引的那些信息

norms


  • true| false
  • 是否存储归一化相关参数,如果字段仅用于过滤和聚合分析,可关闭

doc_values


  • true| false
  • 是否启用 doc_values,用于排序和集合分析

field_data


  • true| false
  • 是否为text类型启用 fielddata,实现排序和聚合分析

store


  • true| false
  • 是否存储该字段

coerce


  • true| false
  • 是否开启自动数据类型转化,比如字符串转为数字、浮点转为整型等

multifields 多字段


  • 灵活使用多字段特性来解决多样的业务需求

dynamic


  • true| false | strict
  • 控制 mapping 自动更新

date_datection


  • true| false
  • 是否自动识别日期类型

Mapping 字段属性的设定流程在这里插入图片描述


是何种类型


字符串类型


  • 需要分词则设定为 text 类型, 否则设置为 keyword 类型

枚举类型


  • 基于性能考虑将其设定为 keyword 类型,即便该数据为整型

数值类型


  • 尽量选择贴近的类型,比如byte即可表示所有数值是,即选用 byte ,不要用 long

其他类型


  • 比如布尔类型、日期、地理位置数据等

是否需要索引


  • 完全不需要检索、排序、聚合分析的字段
    - enable 设置为false
  • 不需要检索的字段
    - index 设置为 false
  • 需要检索的字段,可以通过如下配置设定需要的存储粒度
    - index_options 结合需要设定
    - norms 不需要归一化数据是关闭即可

不需要排序或者聚合分析功能


  • doc_values 设定为 false
  • fielddata 设定为 false

是否需要另行存储?


  • 是否需要专门存储当前字段的数据?
    - store 设定为 true,即可存储该字段的原始内容(与_source 中的不相关)
    - 一般结合_source的enabled 设定为false

实例


博客文章 blog_index


  • 标题 title
  • 发布日期 publish_date
  • 作者 author
  • 摘要 abstract
  • 网络地址 url

blog_index 的 mapping 设置如下:

在这里插入图片描述


博客文章 blog_index


  • 标题 title
  • 发布日期 publish_date
  • 作者 author
  • 摘要 abstract
  • 内容 content ## 加入一个大字段如何设置mapping
  • 网络地址 url



  • blog_index 的 mapping 设置如下
    在这里插入图片描述

用 _source= … 也可过滤,但他只在coordinating 节点做过滤,各个节点返回coordinating 节点的 _source 还是一样的内容。



实例

在这里插入图片描述


关联关系处理


  • ES 不擅长处理关系型数据库中的关联关系,比如文章表 blog 与评论表 comment之间通过 blog_id 关联,在 ES 中可以通过如下两种手段相解决
    - Nested Object
    - Parent/Child
  • 评论 Comment
    - 文章 Id blog_id
    - 评论人 username
    - 评论 日期 date
    - 评论内容 content
    在这里插入图片描述

关联关系处理之 Nested Object

在这里插入图片描述
在这里插入图片描述


  • Comments 默认是 Object Array,存储结构类似下面的形式:
    在这里插入图片描述
  • Nested Object 可以解决这个问题在这里插入图片描述
    在这里插入图片描述

关联关系处理之 Parent/Child


  • ES 还挺了类似关系数据库中 join 的实现方式,使用join数据类型实现在这里插入图片描述

创建关系文档

在这里插入图片描述


查询关联语法


  • 常见 query语法包括如下几种
    - parent_id: 返回某父文档的子文档 (父文档 id 为2 的子文档)在这里插入图片描述
    - has_child 返回包含某子文档的父文档(评论包含 world 的父文档)在这里插入图片描述
    - has_parent 返回包含某父文档的子文档(标题为 ‘blog’ 的子文档)
    在这里插入图片描述

Nested Object vs Parent/Child

在这里插入图片描述
建议尽量选择 Nested Object 来解决问题


Reindex


  • 指重建所有数据的过程,一般发生在如下情况:
    - mapping 设置变更,比如字段类型变化、分词器字典更新等
    - index 设置变更,比如分片数更改等
    - 迁移数据
  • ES 提供了现成的API 用于完成该工作
    - _update_by_query 在现有索引上重建
    - _reindex 在其他索引上重建

Reindex - _update_by_query


将 blog_index 的所有文档重建一遍;conflicts=proceed 覆盖之后来的更新
在这里插入图片描述



Reindex - _reindex


将 blog_index 重建到 blog_new_index 中


在这里插入图片描述


query -> 迁移部分文档
在这里插入图片描述



Reindex -Task


  • 数据重建的时间受索引文档规模的影响,当规模越大,所系时间越多,此时需要通过设定url 参数 wait_for_completion 为false 来异步执行,ES以 task 来描述此类执行任务
  • ES 提供了 Task API 来查看任务的执行进度和相关数据在这里插入图片描述

推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 一、前言在数据库中,慢查询日志通常是用来进行优化数据库,MySQL中存在慢查询,Mongodb中也是如此。在Mongo中的慢查询属于Mon ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了Mongodb副本集+分片集群搭建相关的知识,希望对你有一定的参考价值。环境需求: ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • Intellij IDEA中详细图解连接MySQL腾讯云数据库以及基础操作
    虽然小编记录的是在IDEA中连接mysql腾讯云数据库。当然,如果读者使用的是本地数据库,也是一样的操作,只是数据库的url书写有所不同。 ... [详细]
  • SeMITechnologies正在使用矢量搜索引擎Weaviate构建的内容。SeMI的首席执行官兼联合创始人BobvanLuijt说,它是一种独特的AI优先数据库,使用机器学习 ... [详细]
  • MongoDB学习:(二)MongoDB简单使用
    MongoDB学习:(二)MongoDB简单使用MongoDB使用:执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面>mongo提示 ... [详细]
author-avatar
多米音乐_34249295
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有