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

2024-06-14 13:32

本文主要是介绍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/

如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。

 

这篇关于Elasticsearch 6.x版本全文检索学习之数据建模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060538

相关文章

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很