第四章 Elasticsearch mapping

摘要

映射是定义文档及其包含的字段,存储和索引方式的过程。例如,使用映射定义:

  1. 哪些字符串字段应视为全文字段
  2. 哪些字段包含数字,日期或地理位置
  3. 日期字段的格式。
  4. 自定义规则,用于控制动态添加字段的映射 。
  5. 元字段,Mate-fields。被用于自定义如何处理关联文档,例如:_index, _id, _source
  6. 字段,属性。包含属性与文档相关的字段列表

元字段

每个文档都有与之关联的元数据,例如_index,映射 _type_id元字段。创建映射类型时,可以自定义其中一些元字段的行为。

标记文档位置的元字段

  1. _index, 文档所属的索引。
  2. _type,文档的映射类型
  3. _id,文档的主键

文档源 元字段

  1. _source,表示文档正文的原始JSON。
  2. _size,由插件mapper-size _source提供的字段大小(以字节为单位)

索引元字段

  1. _field_names,文档中包含非空值的所有字段。
  2. _ignored,由于ignore_malformed,导致在索引的时候,被忽略的文档中的所有字段。

路由元字段

_routing,一个自定义的路由值,用于将文档路由到特定的分片。

其他元领域编辑

_meta,特定于应用程序的元数据。

字段数据类型

为不同的目的而以不同的方式对同一字段建立索引,通常很有用。例如,一个string字段可以被索引为text全文搜索的字段,也可以被索引keyword为排序或聚合的字段。或者,您可以使用standard分析器, english分析器和 french分析器为字符串字段建立索引。

大多数数据类型通过fields参数支持multi-fields

详情请看

动态映射

字段和映射不需要在使用之前定义。通过动态映射,仅通过索引文档即可自动添加新的字段名称。新字段可以添加到顶级映射类型中,也可以添加到嵌套类型中。
可以将动态映射规则配置为自定义用于新字段的映射。
Elasticsearch的最重要功能之一是它试图摆脱束缚,让您尽快开始探索数据。要为文档建立索引,您不必先创建索引,定义映射类型并定义字段-您只需为文档建立索引,索引,类型和字段就会自动生效。简单的来说,您在创建索引文档时,如果索引在Elasticsearch 中不存在,Elasticsearch 会自动根据您的文档生成相应的索引和索引映射类型。

自动检测和添加新字段称为 动态映射。可以通过以下方式自定义动态映射规则以适合您的目的:

  1. 动态字段映射,管理动态检测的规则
  2. 动态模版,用于为动态添加的字段配置映射的自定义规则
  3. 索引模板允许您配置新索引的默认映射,设置和别名,无论是自动创建还是显式创建。

显式映射

您对数据的了解超出了Elasticsearch的猜测,因此尽管动态映射对于入门非常有用,但有时您仍需要指定自己的显式映射。
当你可以创建字段映射创建索引和 字段添加到现有的索引。

新建一个索引

PUT /my-index
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}

添加新字段到已存在的索引中

PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

修改字段映射

除了支持的映射参数外,您不能更改现有的字段的映射或字段类型。更改现有字段可能会导致已经建立索引的数据无效。
如果您需要更改字段索引,可以首先创建具有正确映射的一个索引,然后将您的数据重定向到原来的索引中。重命名字段会使在旧字段名称下已建立索引的数据无效。而是添加一个alias字段以创建备用字段名称。或者说,如果可以的话,直接将原索引的数据复制到新索引中。

查看索引映射关系

GET /my-index/_mapping

查看索引某个字段的映射类型

GET /my-index/_mapping/field/employee-id

防止映射爆炸的设置

在索引中定义太多字段会导致映射爆炸,这可能会导致内存不足错误和难以恢复的情况。
考虑一种情况,其中插入的每个新文档都引入了新字段,例如带有动态映射的字段。每个新字段都添加到索引映射中,随着映射的增长,这可能会成为问题。

使用以下设置来限制(手动或动态创建的)字段映射的数量,并防止文档引起映射爆炸:

index.mapping.total_fields.limit

索引中最大字段数,字段和对象映射以及字段的别名都计入此限制,默认值为1000
如果这个值较大,可能会导致性能下降和内存问题,尤其是在负载较高或资源很少的集群中。

index.mapping.depth.limit

字段的最大深度,以内部对象的数量衡量。例如,如果所有字段都在根对象级别定义,则深度为1。如果存在一个对象映射,则深度为 2,等等。默认值为20。

index.mapping.nested_fields.limit

nested索引中 最大不同映射的数量。nested仅在需要相互独立地查询对象数组时,才应在特殊情况下使用该类型。为了防止设计不良的映射,此设置限制了nested每个索引的唯一类型的数量。默认值为50。

index.mapping.nested_objects.limit

单个文档可跨所有nested类型包含的最大嵌套JSON对象数 。当文档包含太多嵌套对象时,此限制有助于防止出现内存不足错误。默认值为10000。

index.mapping.field_name_length.limit

设置字段名称的最大长度。此设置实际上不能解决映射爆炸问题,但是如果您想限制字段长度,该设置可能仍然有用。通常不需要设置此设置。除非用户开始添加名称非常长的大量字段,否则默认设置是可以的。默认值为 Long.MAX_VALUE(无限制)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章