ElasticSearch之数据建模

写在前面

本文看下es数据建模相关的内容。

1:什么是数据建模

数据建模是对真实数据的一种抽象,最终映射为计算机形式的表现。其包括如下三个阶段:

1:概念模型
2:逻辑模型
3:数据模型

2:es数据建模的过程

es的数据建模其实就是确定各个字段都需要如何进行设置,什么类型?是否需要搜索?等,具体需要考虑的问题如下:
在这里插入图片描述

注意以上四个要素没有先后的顺序,而只是需要综合考虑的因素。

2.1:数据类型

为了选择合适的数据类型,我们来看下每种数据类型的特点。

2.1.1:text

默认会被分词器分词,可以搜索,但是不支持聚合和排序,如果想要支持的话需要显式将fielddata设置为true。

2.1.2:keyword

不会被分词,所以一般用在不需要分词时使用,如主键id,邮箱,手机号,身份证号等。支持聚合,搜索和排序,以及用于查询时精确匹配方式的过滤。

2.1.3:多字段类型

当希望一个数据按照多种的数据类型来存储,从而满足诸如按照不同的分词器进行分词,按照不同的查询条件进行查询(如存储为int则可以按照range来查询),但又不希望设置多个字段时使用。默认的在es中如果时字段时text类型的,则会默认添加一个名称为keyword的keyword类型的字段,当然实际工作中我们我们不需要这个默认行为则可以通过显式mapping来自己定义。

2.1.4:数值类型

数值类型是一种结构化数据,数值类型应该尽量设置能够满足存储要求的最小类型,如可以设置为byte,就不要设置为long。

2.1.5:枚举类型

枚举类型是一种结构化数据,建议设置为keyword,以获得更好的性能。

2.1.6:日期,布尔,地理信息等

设置为对应的类型即可。

2.2:搜索,聚合,排序

  • 搜索
    是否需要被搜索,也是对字段进行建模时要考虑的一个重要因素,因为搜索功能需要分词,以及创建对应的倒排索引数据结构,所以需要额外的存储消耗,以及构建对应数据结构的性能消耗。
  • 聚合,排序
    聚合和排序功能需要依赖于doc_values,和fielddata,需要简历对应的数据结构来满足聚合和排序功能,因此也会有对应的存储成本,和对应数据结构的维护成本。
    对于这三个因素可从以下方面进行考虑:
1:如果是同时不需要搜索,聚合和排序,则可考虑设置enable=false,不存储_source(还需要注意不存储_source的话将无法reindex和更新)
2:如果是不需要搜索,则可以设置index:false
3:如果不需要聚合和排序,则可以设置doc_values和fielddata为false
4:如果是更新频繁,聚合频繁,则可考虑设置keyword类型的eager_global_ordinals为true,可以利用缓存来提高性能。

2.3:额外存储字段值

如果希望额外存储字段值,则可以设置store:true,一般结合enbled:false使用。

enabled:false一般应用在一些指标数据的存储上,这些数据不需要reindex,更新。此时如果还希望查看某些字段的话则可以设置store为true。

但是实际的应用中不建议直接设置enabled:false,而是考虑使用高压缩的存储方式来减少存储的开销。

2.4:数据建模优化实例

假定我们要对如下的数据进行建模:
在这里插入图片描述
如下是默认生成的mapping:
在这里插入图片描述
其中cover_url被自动映射为text类型,并增加keyword类型的子字段,如下:

# Index 一本书的信息
PUT books/_doc/1
{"title": "Mastering ElasticSearch 5.0","description": "Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins","author": "Bharvi Dixit","public_date": "2017","cover_url": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}#查询自动创建的Mapping
GET books/_mapping

在这里插入图片描述
假定根据实际的业务需求,cover url不需要支持搜索,只需要支持聚合即可,此时我们就可以将其显式的设置为keyword,并将index设置为false,如下:

DELETE books#优化字段类型
PUT books
{"mappings": {"properties": {"author": {"type": "keyword"},"cover_url": {"type": "keyword","index": false},"description": {"type": "text"},"public_date": {"type": "date"},"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 100}}}}}
}GET books/_mapping

在这里插入图片描述
此时cover_url因为设置了index:false就不支持搜索了:

#Cover URL index 设置成false,无法对该字段进行搜索
POST books/_search
{"query": {"term": {"cover_url": {"value": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"}}}
}

在这里插入图片描述
但依然是支持聚合的:

#Cover URL index 设置成false,依然支持聚合分析
POST books/_search
{"aggs": {"cover": {"terms": {"field": "cover_url","size": 10}}}
}

在这里插入图片描述
假定需求发生变更,要求将文章的内容存储在content字段中,并且不需要做更新和reindex。

考虑到content内容比较大,所以如果放在_source中返回的话会占用比较多的网络带宽资源,并且数据查询到额速度也会降低,所以为了解决这个问题,我们可以考虑如下的两种方案:

1:source filtering不返回数据,特别是content
2:设置enabled:false,并设置字段store:true

其中对于1:source_fitering 只是在返回给客户端时不返回,在汇总数据时还是返回的,如下图:
在这里插入图片描述
所以对于这个需求我们需要通过2设置enabled:false来解决。

如下在mapping中显式设置enabled:false:

DELETE books
#新增 Content字段。数据量很大。选择将Source 关闭
PUT books
{"mappings": {"_source": {"enabled": false},"properties": {"author": {"type": "keyword","store": true},"cover_url": {"type": "keyword","index": false,"store": true},"description": {"type": "text","store": true},"content": {"type": "text","store": true},"public_date": {"type": "date","store": true},"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 100}},"store": true}}}
}

在这里插入图片描述
插入数据:

# Index 一本书的信息,包含Content
PUT books/_doc/1
{"title": "Mastering ElasticSearch 5.0","description": "Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins","content": "The content of the book......Indexing data, aggregation, searching.    something else. something in the way............","author": "Bharvi Dixit","public_date": "2017","cover_url": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}#查询结果中,Source不包含数据
POST books/_search
{}

在这里插入图片描述
但依然可以查询和高亮,因为store:true所以会存储字段的原始值(但是enabled:false所以原始文档是不存储的,即_source是没有信息的)

#搜索,通过store 字段显示数据,同时高亮显示 conent的内容
POST books/_search
{"stored_fields": ["title","author","public_date"],"query": {"match": {"content": "searching"}},"highlight": {"fields": {"content": {}}}
}

在这里插入图片描述

写在后面

参考文章列表

source filtering 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫基础-----运算符(第三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

纹理压缩算法

一、什么是纹理压缩 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图自然表现力也是越强,但是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中还是非常非…

实时通讯技术实现

实时通讯技术实现 前言 在CS架构中,经常会有实时通信的需求。客户端和服务端建立连接,服务端实时推送数据给客户端。本文介绍几种常见的实现方式,希望能给读者们一点点参考。 实时通讯的主要实现技术 长轮询(Long Polling) WebSocket 服务器发…

牛客周赛 Round 38(A,B,C,D,E,F,G)

比赛链接 官方讲解(不分P不分段直接两小时怼上来是坏文明 ) 这场的题很棒,思维有难度,考察的知识点广泛,有深度,很透彻。感觉学到了很多。建议补题。 A 小红的正整数自增 思路: 签到。 可以…

6.5 Batch Normalization

在训练神经网络时,往往需要标准化(normalization)输入数据,使得网络的训练更加快速和有效。 然而SGD(随机梯度下降)等学习算法会在训练中不断改变网络的参数,隐藏层的激活值的分布会因此发生变…

VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法

数据集的属性(属性数据)是与数据集结构相关联的。而数据集又是建立在点和单元的基础上,所以数据属性很自然地是与点和单元相关联。即每个点或每个单元都有与其对应的数据属性。 数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的…

学生宿舍智能控电柜安装调试技术

学生宿舍智能控电柜安装调试石家庄光大远通电器有限公司宿舍控电限电管理系统是一种用于管理学生宿舍用电的智能系统,主要功能包括: 1.实时监控和控制:该系统能够实时监测和记录宿舍的用电情况,包括电器使用情况、电量消耗等。管理人员可以通过电脑或手机…

探索酷开科技独特魅力|加入酷开会员让观影之旅更畅快|酷开系统

你是否渴望一场震撼心灵的观影之旅?不妨走进酷开系统的世界,徜徉在剧集的海洋,满足无限观影的渴望!还在担心剧荒吗?还在为无聊的周末发愁吗酷开系统为你赶走无聊,它拥有海量的影视资源,4大片库、…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一,list 1, list 的节点与迭代器 2,list 的数据结构、一些简单的功能、构造函数 3,list 的对元素操作 4,C 11 的一些功能 5,完整代码: 二,queue 一,list std…

开源 OLAP 及其在不同场景下的需求

目录 一、开源 OLAP 综述 二、OLAP场景思考 2.1 面向客户的报表 2.2 面向经营的报表 2.3 末端运营分析 2.4 用户画像 2.5 订单分析 2.6 OLAP技术需求思考 三、开源数据湖/流式数仓解决方案 3.1 离线数仓体系——Lambda架构 3.2 实时数据湖解决方案 3.3 实时分析解决…

Java毕业设计-基于springboot开发的校园台球厅人员与设备管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的校园台球厅人…

Linux-1.常见指令以及权限理解

目录 本节目标 使用 XShell 远程登录 Linux 关于 Linux 桌面 下载安装 XShell 查看 Linux 主机 ip 使用 XShell 登陆主机 XShell 下的复制粘贴 Linux下基本指令 登录Linux服务器 新建多用户 全屏 1.快速认识5~6个命令 2.详细谈论课件的所有指令 01. ls 指令 02…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列…

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库(ORM) 应用偏好数据库 分布式数据库 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…

Pandas与Jupyter Notebook的完美结合【第153篇—数据分析】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行数据分析:Pandas与Jupyter Notebook的完美结合 在数据科学和分析…

职场口才提升之道

职场口才提升之道 在职场中,口才的重要性不言而喻。无论是与同事沟通协作,还是向上级汇报工作,亦或是与客户洽谈业务,都需要具备良好的口才能力。一个出色的职场人,除了拥有扎实的专业技能外,还应具备出色…

web自动化测试系列-selenium的安装和运行(一)

目录 web自动化系列之如何安装selenium 1.web自动化中的三大亮点技术 2.web自动化能解决什么问题 ? 3.为什么是selenium ? 4.selenium特点 5.selenium安装 6.下载浏览器及驱动 7.测试代码 web自动化系列之如何安装selenium web自动化 ,一个老生…

【C++】vector介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. vector的介绍3. Member functions3.1 (constructor)3.2 (destructor) 4. Capacity4.1 resize4.2 reserve4.3 shrink_to_fit 5. vector 增删查改5.1 push_back5.2 insert5.3 pop_back5.4 find5.5 erase 1. 前…

【C++】模板与泛型编程

文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 非类型模板参数5. 模板的特化5.1 概念5.2 函数模板特化5.3 全特化5.4 偏特化5.5 类模板…