热门标签 | 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 来查看任务的执行进度和相关数据在这里插入图片描述

推荐阅读
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • EST:西湖大学鞠峰组污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
    点击蓝字关注我们编译:祝新宇校稿:鞠峰、袁凌论文ID原名:PathogenicandIndigenousDenitrifyingBacte ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
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社区 版权所有