Elasticsearch Mapping类型映射概述与元字段详解

Stella981
• 阅读 710

本节开始将对ES类型映射机制进行详细解读。

Mapping概述

Mapping,映射,相当于关系型数据库创建语句,定义文档字段及其类型、索引与存储方式。通常会涉及如下方面:

  • 文档中哪些字段需要定义成全文索引字段。

  • 文档中哪些字段定义为精确值,例如日期,数字、地理位置等。

  • 文档中哪些字段需要被索引(能通过该字段的值查询文档)。

  • 日期值的格式。

  • 动态添加字段的规则定义等。

映射类型

Elasticsearch支持meta-fields、fields or properties两种映射类型,将决定文档的索引方式。

  • Meta-fields
    元数据字段用于定义文档的元数据字段的特征,文档的元数据字段主要包括_index、_type、_id、_sour
    ce这4个字段。

  • Fields or properties
    属性字段列表,通过properties字段定义整个文档有效载荷的各字段的数据类型、分词器等属性。

映射类型,可以理解为以何种方式来定义索引中一个类型的字段集。

数据类型

每一个字段都会指定一个数据类型,数据类型通常如下:

  • 简单类型,例如text、keyword、d
    ate、long、double、boolean、ip。

  • 复合类型,诸如object(json)、nets
    ed.

  • 特殊类型,诸如geo_point、geo_s
    hape(地图相关类型)、completion。

后续章节会单独重点剖析elasticsearch所支持的数据类型。

映射保护机制

es提供如下参数来限制es的行为:

  • index.mapping.total_fields.limit
    索引中允许定义的最大字段(属性)个数,默认为1000。

  • index.mapping.depth.limit
    字段级联的最大深度,默认为20。

  • index.mapping.nested_fields.limit
    一个索引最多包含字段类型为nest
    ed的个数,默认为50。

动态映射机制

与关系型数据库不同的是,一个type(对应关系型数据库的表)中的字段可以在使用过程中动态添加。具体的动态映射机制,将在后续文章中单独结束。

更新已有映射定义

Elasticsearch不支持直接修改已索引的已存在的字段映射,因为修改字段映射,意味着已索引的数据生效,可以使用别名机制来修改字段的名称,如果需要修改已存在字段的映射,建议重新创建一个索引,再使用reindex API迁移数据。

索引、type组织方式

索引在创建时,Elasticsearch6.x版本只支持一个映射类型,而7.x版本后将完成删除映射类型。5.x中一个索引包含多个type的情况再6.x版本将继续支持查询。7.0版本后,API将完成移除与多类型相关的API。

Elasticsearch6.x版本后为什么不继续对单一索引库提供多类型支持呢?

当初,为了方便理解es,通常与关系型数据库进行类比,例如es中的index相当于关系型数据库的database,而类型相当于关系型数据库中的table。其实这是一个错误的比喻。在关系型数据库中,表是相互独立的,一个表中的列名与另外一个表中的列名相同是没有关系的,但对于es的类型映射定义,情况并非如此。

在es单一索引中,不同映射类型(type)具有相同名称的字段在内部都是由同一个Lucence字段来存储,这也就意味着同一个索引内不同的类型,如果出现名字相同的字段,其数据类型也必须相同。更重要的是,存储在同一索引中具有很少或没有共同字段的不同类型(实体)会导致数据稀疏,大大降低Lucece高效压缩文档的能力,影响其检索性能。

基于上述各种原因,故es将在后续版本中不支持一个索引中定义多个类型。

meta-fields

每个文档都有与之关联的元数据,例如_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来定义需要聚合的字段。

  • _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字段:

    1PUT tweets 2{ 3  "mappings": { 4    "_doc": { 5      "_field_names": { 6        "enabled": false 7      } 8    } 9  }10}                                                        }

  • _ignored
    设置为ignore_malformed=true的所有字段。

routing meta-field

  • _routing
    分片路由字段。

other meta-field

  • _meta
    用于用户自定义的元数据,例如:

    1PUT my_index 2{ 3  "mappings": { 4    "_doc": { 5      "_meta": {  6        "class": "MyApp::User", 7        "version": { 8          "min": "1.0", 9          "max": "1.3"10        }11      }12    }13  }14}                                                        }


更多文章请关注微信公众号:

Elasticsearch Mapping类型映射概述与元字段详解

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
ES添加字段
背景Elasticsearch是schemaless的数据存储方案。可以任意的向索引中添加字段。在此需明确以下背景:1.ES新添加的字段只对新数据、新type起作用;原有已经索引的数据不会生效;2.为加快ES的检索和索引效率,构建索引时会指定其mapping结构;添加索引字段即修改mapping;3.目前我们采用两种索引方案
Stella981 Stella981
3年前
Elasticsearch从入门到放弃:瞎说Mapping
前面我们聊了Elasticsearch的索引、搜索和分词器,今天再来聊另一个基础内容——Mapping。Mapping在Elasticsearch中的地位相当于关系型数据库中的schema,它可以用来定义索引中字段的名字、定义字段的数据类型,还可以用来做一些字段的配置。从Elasticsearch7.0开始,Mapping中不在乎需要
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Elasticsearch Dynamic Mapping(动态映射机制)
Elasticsearch可以根据待索引数据自动建立索引、自动定义映射类型。1PUT data/_doc/1 2{ "count": 5 }执行上述请求时,索引"data"不必预先创建,该API首先会自动创建索引data、类型映射\_doc,其映射类型下包含字段count,其类型为long。自动根据文档的值推测其类型的过程,就是本文要重点描述
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这