ES[7.6.x]学习笔记(五)动态映射
通常情况下,我们使用ES建立索引的步骤是,先创建索引,然后定义索引中的字段以及映射的类型,然后再向索引中导入数据。而动态映射是ES中一个非常重要的概念,你可以直接向文档中导入一条数据,与此同时,索引、字段、字段类型都会自动创建,无需你做其他的操作。这就是动态映射的神奇之处。
动态字段映射
ES的动态映射默认是开启的,动态映射的默认规则如下:
JSON的数据类型 | ES中的数据类型 |
---|---|
null | 不会映射字段 |
true 或 false | boolean类型 |
浮点型数字 | float |
整型数字 | long |
JSON对象 | Object |
数组 | 第一个非空值得类型 |
String | 1、如果满足日期类型的格式,映射为日期类型 |
2、如果满足数字型的格式,映射为long或者float | |
3、如果就是字符串,会映射为一个text类型和一个keyword类型 |
接下来我们看看动态映射的一个例子,我们直接向dynamic-index
索引中存放一条数据,注意,dynamic-index
这个索引我们没有创建过,直接存放数据,索引会自动创建。接下来,我们看一下具体的请求:
PUT /dynamic-index/_doc/1 { "my_null": null, "my_boolean": false, "my_float": 1.56, "my_long": 3, "my_object": { "my_first": "first value", "my_second": "second_value" }, "my_array": [1,2,3], "my_date_1": "2020-05-01", "my_date_2": "2020/05/01 12:03:03", "my_date_3": "05/01/2020", "my_string_long": "1", "my_string_float": "4.6", "my_string": "中华人民共和国" }
请求执行成功以后,我们先看一下索引的类型:
GET /dynamic-index/_mapping
返回的结果如下:
{ "dynamic-index": { "mappings": { "properties": { "my_array": { "type": "long" }, "my_boolean": { "type": "boolean" }, "my_date_1": { "type": "date" }, "my_date_2": { "type": "date", "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis" }, "my_date_3": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_float": { "type": "float" }, "my_long": { "type": "long" }, "my_object": { "properties": { "my_first": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_second": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "my_string": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_string_float": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_string_long": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }
返回的结果比较长,我们把每一个字段都看一下,看看动态映射的字段是否达到了我们的预期:
字段 | 映射结果 | 是否达到预期 | 原因 |
---|---|---|---|
my_null | 没有映射 | 是 | null值不映射 |
my_boolean | boolean | 是 | |
my_float | float | 是 | |
my_long | long | 是 | |
my_object | object | 是 | my_object里自动生成了两个字段的映射 |
my_array | long | 是 | 数组中的数字是long型 |
my_date_1 | date | 是 | |
my_date_2 | date | 是 | |
my_date_3 | text | 否 | 没有指定这种日期格式,所以映射为text |
my_string_long | text | 否 | 数字探测默认关闭,没有打开 |
my_string_float | text | 否 | 数字探测默认关闭,没有打开 |
my_string | text | 是 | 普通字符串,映射为text |
下面我们把数字探测打开,执行如下请求:
PUT /dynamic-index { "mappings": { "numeric_detection": true } }
由于我们的索引dynamic-index
中,存在了映射关系,再进行设置是会报错的,所以我们要将索引删除,执行如下请求:
DELETE /dynamic-index
索引删除成功后,再执行前面的设置,执行成功,数字探测已经打开。然后再添加一种日期格式MM/dd/yyyy
,请求如下:
PUT /dynamic-index { "mappings": { "dynamic_date_formats": ["MM/dd/yyyy"] } }
执行报错,错误信息和之前一样,看来日期的设置要和数字探测一起才行,我们再将索引删除,然后再发送请求,两个设置一起:
PUT /dynamic-index { "mappings": { "numeric_detection": true, "dynamic_date_formats": ["MM/dd/yyyy"] } }
执行成功,我们再发送之前创建索引数据的请求
PUT /dynamic-index/_doc/1 { "my_null": null, "my_boolean": false, "my_float": 1.56, "my_long": 3, "my_object": { "my_first": "first value", "my_second": "second_value" }, "my_array": [1,2,3], "my_date_1": "2020-05-01", "my_date_2": "2020/05/01 12:03:03", "my_date_3": "05/01/2020", "my_string_long": "1", "my_string_float": "4.6", "my_string": "中华人民共和国" }
执行成功,我们再看一下索引的映射,
"my_string_float": { "type": "float" }, "my_string_long": { "type": "long" } "my_date_1": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_date_2": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "my_date_3": { "type": "date", "format": "MM/dd/yyyy" },
我们重点看一下以上几个字段,my_string_float
和my_string_long
映射成我们想要的类型了,由于我们开启了数字探测。再看看我们映射的3个日期类型,咦?只有my_date_3
映射了日期类型,其他两个都是映射成了text类型,这是由于我们在设置dynamic_date_formats
时,只指定了一种格式。我们只需要把其他两种类型的日期格式也加上就可以了。
{ "mappings": { "numeric_detection": true, "dynamic_date_formats": ["MM/dd/yyyy","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd"] } }
这里就不给大家具体演示了,有兴趣的小伙伴去尝试一下把。
动态字段是ES中一个非常重要的功能,它给我们带来了极大的方便,也省去了我们在开发时创建索引字段的时间,真是事半功倍,小伙伴们要好好掌握哦~~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
混合云存储,备份、归档、容灾一个也不能少
人人都说,混合云/多云是未来。IDC曾预测,2018年,85%以上的大型企业都将采用混合云。RightScale发布的2018年云计算调查报告也显示出同样的趋势,81%的企业都有一个多云策略,其中又有51%的企业将专注于混合云。常常与一线客户打交道的UMCloud CTO王璞指出:“当前,虽然很多客户可能不会马上用到混合云,但也不大会拒绝混合云,反而充满了期待。一个最根本的原因是,绝大部分客户现有的IDC资源是有限的,在IDC资源紧张时,客户希望在私有云的基础上能够更加灵活地调用公有云资源。这其实就是混合云最基本的一种应用模式。”混合云是不是就是简单的“私有云+公有云”的形态呢?通常情况下,企业用户会从私有云起步,然后扩展到公有云,从而形成混合云,这也被定义为“正向混合云”。此时的混合云不仅仅是基于IaaS的云主机混合的概念,客户同时也产生了统一资源管理、统一存储管理和统一应用管理的需求。今天,我们就要重点谈一谈混合云模式下的统一存储管理话题。 混合云存储管理的 “统一” 一谈到“混合”,这事一定不简单,可能会涉及不同的地点、不同的系统、不同的应用、不同的数据之间的连接、交换、流转和管...
- 下一篇
什么是机器阅读理解?跟自然语言处理有什么关系?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 导读:机器阅读理解(Machine Reading Comprehension,MRC)是一种利用算法使计算机理解文章语义并回答相关问题的技术。由于文章和问题均采用人类语言的形式,因此机器阅读理解属于自然语言处理(Natural Language Processing,NLP)的范畴,也是其中最新、最热门的课题之一。 近年来,随着机器学习(Machine Learning),特别是深度学习(Deep Learning)的发展,机器阅读理解研究有了长足的进步,并在实际应用中崭露头角。 本文将介绍机器阅读理解任务的相关概念,并讨论这项课题所涉及的自然语言处理这项关键支撑技术。 01 机器阅读理解任务 学者C. Snow于2002年发表的一篇论文中将阅读理解定义为“通过交互从书面文字中提取与构造文章语义的过程”。而机器阅读理解的目标是利用人工智能技术,使计算机具有和人类一样理解文章的能力。 图1所示为机器阅读理解的一个样例。示例中,机器阅读理解模型需要用文章中的一段原文来回答问题。 1. 机器...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作