专栏首页别先生Elasticsearch 6.x版本全文检索学习之数据建模

Elasticsearch 6.x版本全文检索学习之数据建模

1、什么是数据建模。

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

2、数据建模的过程。

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

3、Elasticsearch的数据建模,es是基于lucene以倒排索引为基础实现的存储体系,不遵循关系型数据库中的范式约定。

4、Elasticsearch的数据建模中Mapping字段的相关设置。

  答:a、enabled,值包含true、false。仅存储,不做搜索或者聚合分析。     b、index,值包含true、false。是否构建倒排索引。     c、index_options,值包含docs、freqs、positions、offsets。存储倒排索引的哪些信息。     d、norms,值包含true、false。是否存储归一化相关参数,如果字段仅用于过滤和聚合分析,可以关闭。     e、doc_values,值包含true、false。是否启动doc_values,用于排序和聚合分析。     f、field_data,值为true、false。是否为text类型启动fielddata,实现排序和聚合分析。     g、store,值为true、false。是否存储该字段值。     h、corece,值为true、false。是否开启自动数据类型转换功能,比如字符串转为数字,浮点转为整型等等。     i、multifields多字段,灵活使用多字段特性来解决多样的业务需求。     j、dynamic,值为true、false、strict。控制mapping自动更新。建议为strict,或者false。     k、date_detection,值为true、false。是否自动识别日期类型。建议为false。

5、Mapping字段属性的设定流程。

  答:第一步、是何种类型的字段。是日期类型还是字符串类型的。     第二步、是否需要检索字段。需要检索index设置true,否则设置为false。     第三步、是否需要排序和聚合分析。doc_values,是否启动doc_values,用于排序和聚合分析。     第四步、是否需要另行存储。store,是否存储该字段值。

6、Mapping字段属性的设定流程,是何种类型的。

  答:a、字符串类型,需要分词则设定为text类型的,否则设置为keyword类型的。     b、枚举类型,基于性能考虑将其设定为keyword类型,即便该数据为整型。     c、数值类型,尽量选择铁近的类型,比如byte即可表事所有数值的时候,即选用byte,不要用long。     d、其他类型的,比如布尔类型,日期,地理位置数据等等。

7、Mapping字段属性的设定流程,是否需要检索。

  答:a、完全不需要检索,排序,聚合分析的字段。enabled设置为false。     b、不需要检索的字段,index设置为false。     c、需要检索的字段,可以通过如下配置设定需要的存储粒度。index_options结合需要设定,norms不需要归一化数据时关闭即可。

8、Mapping字段属性的设定流程,是否需要排序和聚合分析。

  答:不需要排序或者聚合分析功能。doc_values设定为false,fielddata设定为false。

9、Mapping字段属性的设定流程,是否需要另行存储。

  答:是否需要专门存储当前字段的数据?store设定为true,即可以存储该字段的原始内容(与_source中的不相干关)。一般结合_source的enabled设定为false时候使用。

10、ES数据建模实例练习。创建博客文档blog_index。

查询博客blog_index_01的索引映射和分片,副本情况。 插入数据,然后根据指定字段进行查询。

简易的ES模型,如果博客新增了内容context字段。

url字段的store的值为true的时候,enabled的值不能设定为false。因为enabled的值设定为false,会将值存储到_source里面的。doc_values是不需要进行聚合分析的。

11、Elasticsearch关联关系处理,es不擅长处理关系型数据库中的关联关系,比如文章表blog与评论表comment之间通过blog_id关联,在es中可以通过如下两种手段变相解决。Nested Object、Parent/Child。

12、关联关系处理之Nested Object。Comments默认是Objetc Array类型,存储结果类型是对应的字段在一个括号里面。

使用nested object解决查询结果不符合要求的现象。

Nested Object Array的存储类型,nested object是独立存在的。即自己对应的字段在一个括号内。查询的结果如下所示:

13、关联关系处理之Parent/Child。Elasticsearch还提供了类似关系数据库中join的实现方式,使用join数据类型实现。

关联关系处理之Parent/Child。常见query语法包括如下几种。 a、parent_id返回某父文档的子文档。 b、has_child返回包含某子文档的父文档。 c、has_parent返回包含某父文档的子文档。

建议尽量选择使用Nested Object来解决问题。

14、Elasticsearch的Reindex,指重建所有数据的过程,一般发生在如下情况。

  答:a、mappring设置变更,比如字段类型变化,分词器字段更新等等。     b、index设置变更,比如分片数更改等等。     c、迁移数据。

15、Elasticsearch提供了现成的API用于完成该工作。

  答:a、_update_by_query在现有索引上重建。     b、_reindex在其他索引上重建。

数据重建的时候受源索引文档规模的影响,当规模越大的时候,所需时间越多,此时需要通过设定url参数wait_for_completion为false来异步执行,es以task来描述此类执行任务。es提供了task api来查看任务的执行进度和相关数据。

再牛逼的案例,理论,都没有官网的牛逼,下面贴一下,如何去官网学习。

找到这里,自己可以巴拉巴拉,看自己需要的版本,对应的知识点。

16、Elasticsearch数据建模的建议。

  1)、数据模型版本管理,对Mapping版本管理。     包含在代码或者专门的文件进行管理,添加好注释,并加入git版本管理仓库中,方便回顾。为每个增加一个metadata字段,在其中维护一些文档相关的元数据,方便对数据进行管理。mapping版本,可以自行指定,比如每次更新mapping设置后,该version加1。

  2)、防止字段过多。字段过多主要有如下的坏处。

    难于维护,当字段成百上千的时候,基本很难有人能明确知道每个字段的含义。mapping的信息存储在cluster state里面,过多的字段会导致mapping过大,最终导致更新变慢。通过设置index.mapping.total_fields.limit可以限定索引中最大字段数,默认是1000。可以通过key/value的方式解决字段过多的问题,但并不完美。一般字段过多的原因是由于没有高质量的数据建模导致的,比如dynamic设置为true。也可以考虑拆分多个索引来解决问题。

作者:别先生 博客园:https://www.cnblogs.com/biehongli/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • kettle的转换组件

    1、转换是转换里面的第四个分类。转换属于ETL的T,T就是Transform清洗、转换。ETL三个部分中,T花费时间最长,是一般情况下这部分工作量是整个ETL的...

    别先生
  • Kubernetes(k8s)中namespace的作用、反向代理访问k8s中的应用、k8s监控服务heapster

    答:Namespace命名空间,是kubernetes系统中的另一个非常重要的概念,Namespace在很多情况下用于实现多租户的资源隔离,不同的业务可以使用不...

    别先生
  • Spring框架+Struts2框架第一次整合

    1:Spring框架和Struts2框架如何整合???   Spring 负责对象创建   Struts2 用Action处理请求 2:Spring与Strut...

    别先生
  • 浏览器中的机器学习:使用预训练模型

    在上一篇文章《浏览器中的手写数字识别》中,讲到在浏览器中训练出一个卷积神经网络模型,用来识别手写数字。值得注意的是,这个训练过程是在浏览器中完成的,使用的是客户...

    云水木石
  • [Alg]利用蒙特卡洛思想计算圆锥体积

    原文链接:http://blog.csdn.net/humanking7/article/details/78701954

    祥知道
  • 分布式机器学习框架与高维实时推荐系统

    导读:随着互联网的高速发展和信息技术的普及,企业经营过程中产生的数据量呈指数级增长,AI 模型愈发复杂,在摩尔定律已经失效的今天,AI 的落地面临着各种各样的困...

    石晓文
  • 超高清时代云化媒体生产分析

    在超高清时代,传统媒体生产方式效率低下,灵活性差,如4K、VR这类新型媒体内容的产能成为产业链的瓶颈。将内容生产放到云端,可以降低内容生产成本,提高生产效率,促...

    用户1324186
  • 基于tensorflow.js的机器学习

    机器学习是什么?我认为其实就是统计学的另一种花里胡哨/故弄玄虚的说法!tensorflow.js是一个机器学习的框架:

    周星星9527
  • 职场上的高情商就是--工作到位

    春哥大魔王
  • 0.30000000000000004

    0.30000000000000004问题是计算机科学领域的经典BUG, 由比尔盖茨那一代人标准化的浮点数表示法造福了一代人也祸害了一代人, 由...

    Jean

扫码关注云+社区

领取腾讯云代金券