Elasticsearch 参考指南(映射)

映射

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

  • 哪些字符串字段应该被视为全文字段。
  • 哪些字段包含数字、日期或地理位置。
  • 日期值的格式。
  • 用于控制动态添加字段的映射的自定义规则。

映射类型

每一个索引都有一个映射类型,它决定文档将如何被索引。code

映射类型具备:orm

元字段对象

  • 元字段用于自定义如何处理文档的关联元数据,元字段的示例包括文档的_index_type_id_source字段。

字段或属性排序

  • 映射类型包含与文档相关的字段或属性列表。

字段数据类型

每一个字段都有一个数据type索引

  • 简单的类型,如textkeyworddatelongdoublebooleanip
  • 支持JSON的层次结构的类型,如objectnested
  • 或者像geo_pointgeo_shapecompletion这样的特殊类型。

为不一样的目的以不一样的方式索引相同的字段一般是有用的,例如,字符串字段能够做为全文搜索的text字段索引,也能够做为排序或聚合的keyword字段索引,或者,你可使用标准分析器、英语分析器和法语分析器索引字符串字段。ip

这就是多字段的目的,大多数数据类型经过fields参数支持多字段。内存

防止映射爆炸的设置

在索引中定义太多字段会致使映射爆炸,这会致使内存不足和难以恢复的状况,这个问题可能比预期的要广泛。例如,考虑这样一种状况,其中插入的每一个新文档都引入了新字段,这在动态映射中很是常见,每当文档包含新字段时,这些字段就会出如今索引的映射中。这对于少许数据来讲并不使人担忧,可是随着映射的增加,这可能会成为一个问题,如下设置容许你限制能够手动或动态建立的字段映射的数量,以防止错误的文档致使映射爆炸:文档

index.mapping.total_fields.limit字符串

  • 索引中字段的最大数目,字段和对象映射以及字段别名都属于此限制,默认值是1000

index.mapping.depth.limit

  • 字段的最大深度,用内部对象的数量来度量,例如,若是全部字段都在根对象级别定义,则深度为1,若是有一个对象映射,则深度为2,依此类推,默认值是20

index.mapping.nested_fields.limit

  • 索引中不一样嵌套映射的最大数目,默认为50

index.mapping.nested_objects.limit

  • 跨全部嵌套类型的单个文档中嵌套JSON对象的最大数量,默认为10000

index.mapping.field_name_length.limit

  • 设置字段名称的最大长度,默认值是Long.MAX_VALUE(没有限制),这个设置实际上并无解决映射爆炸的问题,可是若是你想限制字段长度,那么它仍然是有用的,一般不须要设置这个设置,默认值没有问题,除非用户开始添加大量具备很是长的名称的字段。

动态映射

字段和映射类型在使用以前不须要定义,多亏了动态映射,新的字段名将自动添加,只需索引文档,能够向顶级映射类型、内部对象和嵌套字段添加新字段。

能够配置动态映射规则来定制用于新字段的映射。

显式的映射

你对数据的了解超过了Elasticsearch所能猜到的,所以,尽管开始动态映射可能颇有用,但在某个时候,你可能但愿指定本身的显式映射。

你能够在建立索引时建立字段映射,还可使用PUT mapping API将字段添加到现有索引中。

更新现有字段映射

除非有文档记录,不然没法更新现有字段映射,更改映射将意味着已经索引的文档无效。相反,应该使用正确的映射建立一个新索引,并将数据从新索引到该索引中,若是只但愿重命名字段而不更改其映射,那么引入别名字段多是有意义的。

映射示例

能够在建立索引时指定映射,以下所示:

PUT my_index 
{
  "mappings": {
    "properties": { 
      "title":    { "type": "text"  }, 
      "name":     { "type": "text"  }, 
      "age":      { "type": "integer" },  
      "created":  {
        "type":   "date", 
        "format": "strict_date_optional_time||epoch_millis"
      }
    }
  }
}
  • 建立一个名为my_index的索引。
  • 指定映射中的字段或属性。
  • 指定title字段包含text值。
  • 指定name字段包含text值。
  • 指定age字段包含integer值。
  • 指定created字段包含两种可能格式的date值。
相关文章
相关标签/搜索