专栏首页中间件兴趣圈Elasticsearch Mapping类型映射概述与元字段详解

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

本节开始将对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}                                                        }

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj),作者:丁威

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Elasticsearch Mapping parameters(主要参数一览)

    指定分词器。elasticsearch是一款支持全文检索的分布式存储系统,对于text类型的字段,首先会使用分词器进行分词,然后将分词后的词根一个一个存储在倒排...

    丁威
  • Elasticsearch Search API之(Request Body Search 查询主体)-上篇

    搜索请求体中查询条件使用es DSL查询语法来定义。通过使用query来定义查询体。

    丁威
  • Elasticsearch之索引管理API(Index management)

    代码@1:索引的配置属性。请详细参考如下博文: 代码@2:定义映射,有点类似于关系型数据库中的定义表结构,详情请参考:Elasticsearch Mapping...

    丁威
  • PostgreSQL 关于字段类型的修改 谣言与止谣

    PostgreSQL 在9.2 之后修改字段的大小,例如 varchar(20) ---> varchar(30) 返回修改仅仅是一瞬间的事情。

    AustinDatabases
  • MySQL——索引实现原理

    在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

    撸码那些事
  • 索引列顺序导致的性能问题

    今天和大家分享一个很有意思的例子,关于索引列的顺序导致的性能问题。 发现数据库的性能比较差,CPU消耗很高,抓了一个awr,发现瓶颈在sql上,top 1的sq...

    jeanron100
  • MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用 B-Tree(B 树)或其变种 B+Tree(B+树)作为索引结构。B+Tree 是数据库系统实现索引的首选数据结构。

    desperate633
  • 【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

    1)根据 source 和 db 字段来获取 MongoDB 集合内 business_time 最大值。

    create17
  • 使用Jenkins持续集成部署QQ小程序

    QQ小程序提供了Docker镜像来对小程序项目进行CI构建(文档)。文档中提供的Github Actions及Drone CI两种CI工具都对Docker的相关...

    TLingC
  • 【npm】伙计,给我来一杯package.json!不加糖

    前言:夜深了,我熬了一锅热气腾腾的package.json,给大家端上来,希望大家喜欢 json和JS对象的区别 package.json,顾名思义,它是一个j...

    外婆的彭湖湾

扫码关注云+社区

领取腾讯云代金券