elasticsearch使用指南之Elasticsearch Mapping类型映射概述与元字段类型
作者简介:《RocketMQ技术内幕》作者、中间件兴趣圈微信公众号维护者。
Mapping,映射,相当于关系型数据库创建语句,定义文档字段及其类型、索引与存储方式。通常会涉及如下方面:
- 文档中哪些字段需要定义成全文索引字段。
- 文档中哪些字段定义为精确值,例如日期,数字、地理位置等。
- 文档中哪些字段需要被索引(能通过该字段的值查询文档)。
- 日期值的格式。
- 动态添加字段的规则定义等。
1、类型映射概述
1.1 映射类型
Elasticsearch支持meta-fields、fields or properties两种映射类型,将决定文档的索引方式。
- Meta-fields
元数据字段用于定义文档的元数据字段的特征,文档的元数据字段主要包括_index、_type、_id、_source这4个字段。 - Fields or properties
属性字段列表,通过properties字段定义整个文档有效载荷的各字段的数据类型、分词器等属性。
映射类型,可以理解为以何种方式来定义索引中一个类型的字段集。
1.2 数据类型
每一个字段都会指定一个数据类型,数据类型通常如下:
简单类型,例如text、keyword、date、long、double、boolean、ip
复合类型,诸如object(json)、netsed.
特殊类型,诸如geo_point、geo_shape(地图相关类型)、completion。
后续章节会单独重点剖析elasticsearch所支持的数据类型。
1.3 映射保护机制
es提供如下参数来限制es的行为:
- index.mapping.total_fields.limit t
索引中允许定义的最大字段(属性)个数,默认为1000。 - index.mapping.depth.limit
字段级联的最大深度,默认为20。 - index.mapping.nested_fields.limit
一个索引最多包含字段类型为nested的个数,默认为50。
1.4 动态映射机制
与关系型数据库不同的是,一个type(对应关系型数据库的表)中的字段可以在使用过程中动态添加。具体的动态映射机制,将在后续文章中单独结束。
1.5 更新已有映射定义
es不支持直接修改已索引的已存在的字段映射,因为修改字段映射,意味着已索引的数据生效,可以使用别名机制来修改字段的名称,如果需要修改已存在字段的映射,建议重新创建一个索引,再使用reindex API迁移数据。
1.6 索引、type组织方式
索引在创建时,Elasticsearch6.x版本只支持一个映射类型,而7.x版本后将完成删除映射类型。es5.x中一个索引包含多个type的情况再6.x版本将继续支持查询,7.0版本后,API将完成移除与多类型相关的API。
Elasticsearch6.x版本后为什么不继续对单一索引库提供多类型支持呢?
当初,为了方便理解es,通常与关系型数据库进行类比,例如es中的index(索引)相当于关系型数据库的database,而类型(type)相当于关系型数据库中的table。其实这是一个错误的比喻。在关系型数据库中,表是相互独立的,一个表中的列名与另外一个表中的列名相同是没有关系的,但对于es的类型映射定义,情况并非如此。
在es单一索引中,不同映射类型(type)具有相同名称的字段在内部都是由同一个Lucence字段来存储,这也就意味着同一个索引内不同的类型,如果出现名字相同的字段,其数据类型也必须相同。更重要的是,存储在同一索引中具有很少或没有共同字段的不同类型(实体)会导致数据稀疏,大大降低Lucece高效压缩文档的能力,影响其检索性能。
基于上述各种原因,故es将在后续版本中不支持一个索引中定义多个类型。
2、meta-field(元字段)
每个文档都有与之关联的元数据,例如_index、mapping _type和_id元字段。在创建映射类型时,可以定制其中一些元字段的行为。
- identity meta-fields(表明文档身份的元字段)
- _index
文档所在的索引,类似于关系型数据库的database。 - _uid
_type与_id的组合,文档的唯一标识。 - _type
文档映射类型。 - _id
文档的_id值。
- document source meta-fields
- _source
文档的原始json数据。 - _size
文档_souce字段的字节长度,需要插件:mapper-size plugin。
- indexing meta-fields
- _all
将所有字段映射成一个_all字段,在6.0.0版本后废弃,可以使用copy_to来定义需要聚合的字段。
2._field_names
_field_names字段,用于索引文档中包含除null之外的任何值的每个字段的名称。exist查询使用这个字段来查找对于特定字段具有或不具有任何非空值的文档,也就是该字段记录的是字段值不为null的所有字段名称。当前版本,_field_names字段不包含启用了doc_values、norm的字段,对于启用doc_values或norm的字段,exist查询仍然可用,但不会使用_field_names字段。
注:禁用_field_names通常是不必要的,因为它不再承载以前的索引开销。如果你有很多禁用doc_value和norm的字段,并且你不需要使用这些字段执行exist查询,你可能想禁用_field_names,你可以通过如下方式禁用_field_names字段:
PUT tweets { "mappings": { "_doc": { "_field_names": { "enabled": false } } } }
- _ignored
设置为ignore_malformed=true的所有字段。
- routing meta-field
- _routing
分片路由字段。
- other meta-field
1._meta
用于用户自定义的元数据,例如:
PUT my_index { "mappings": { "_doc": { "_meta": { "class": "MyApp::User", "version": { "min": "1.0", "max": "1.3" } } } } }
本文初步介绍了Elasticsearch 类型映射与元字段类型,后续文章将介绍映射参数、elasticsearch支持的数据类型、自动类型映射机制等。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
企业级 SpringBoot 教程-sprinboot整合elk,搭建实时日志平台
elk 简介 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。 Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。 elk下载安装 elk下载地址:https: //www. elastic. co/downloads/ 建议在 linux上运行,elk在windows上支持得不好,另外需要jdk1.8 的支持,需要提前安装好jdk. 下载完之后: 安装,以logstash为例子: cd /usr/local/ mkdir logstash tar -zxvf logstash-5.3.2.tar.gz mv logstash-5.3.2 /usr/local/logstash 配置、启动 Elasticsearch 打开Elas...
- 下一篇
使用split_size优化的ODPS SQL的场景
使用split_size优化的ODPS SQL的场景 首先有两个大背景需要说明如下:说明1:split_size,设定一个map的最大数据输入量,单位M,默认256M。用户可以通过控制这个变量,从而达到对map端输入的控制。设置语句:set odps.sql.mapper.split.size=256。一般在调整这个设置时,往往是发现一个map instance处理的数据行数太多。 说明2:小文件越多,需要instance资源也越多,MaxCompute对单个Instance可以处理的小文件数限制为120个,如此造成浪费资源,影响整体的执行性能(文件的大小小于块Block 64M的文件)。 场景一:单记录数据存储太少 原始Logview Detail: 可以发现Job只调起一个Map Instance,供处理了156M的数据,但这些数据共有
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境