Elasticsearch 之 Mappings

映射(Mapping)

映射是用来定义一个文档,和其包含的字段,是如何存储和索引的过程。举例来说,使用映射可以定义:

  • 哪一个字符串字段应该看作全文索引字段;
  • 哪一个字段包含数字,日期,或者地理定位;
  • 是否文档中所有字段的值都该被索引到 _all 字段中;
  • 日期字段值的格式;
  • 自定义的规则控制是否动态添加索引 (附1)
映射类型(Mapping Type)

每个索引都有一份映射类型决定了文档如何被索引。

一个映射类型有:

Meta-fields

  • 元字段用于定制如何处理文档的相关元数据。元字段包括 _index_type_id_source

Fields or properties

  • 一份映射类型包含字段列表或者文档的相关属性。
字段数据类型

每个字段有一种数据类型:

  • 检点类型包括:text、keyword、date、long、double、boolean、ip;
  • 支持 json 层级结构的类型 object 或者 nested。
  • 特殊类型如 geo_point、geo_shape、completion。

为了不同的目的而用不同的方法索引同样的字段是很常见的。举例来说,一个 string 字段可以设置为 text 达到全文索引的目的,或者设置为 keyword 用来排序或者聚合。以上的两种情况任选一个,在分词的情况下,可以给一个字符串字段使用 standard analyzerenglish analyzerfrench analyzer 等分词器。

这就是多字段的目的。大部分数据类型通过字段参数支持多字段。

防止映射激增的设置

在一个索引中定义太多字段是一种可能导致映射爆炸的情况,这可能导致内存不足错误和难以恢复的情况。这个问题可能比预期的更加常见。例如,考虑如下的情况,每个新增加的文档都引入了新的字段。这在动态映射的设置下是很常见的。每次文档包含的新字段都会最终添加到索引的映射中。对于数据集小的情况并没有什么问题,但是如果映射的集持续增长就会产生问题。以下的设置允许你可以限制字段映射的数量,不管是手动还是自动创建的,为了预防糟糕的文档导致映射激增:

index.mapping.total_fields.limit

索引的最大字段数量。默认值 1000。

index.mapping.depth.limit

字段最大深度,用来衡量内部对象的数量。例如,如果所有的字段都定义在根对象的同一级,那么深度就是 1。如果有一个对象映射,那么深度就是 2,以此类推。默认值 20。

index.mapping.nested_fields.limit

在一个索引中 nested 字段的最大数量默认为 50。索引一个拥有 100 个嵌套字段的文档实际上索引了 101 个文档,因为每个嵌套文档都会被索引为一个独立的隐藏文档。

动态映射(Dynamic mapping)

字段和映射类型在使用前不需要定义。多亏了 dynamic mapping,新的字段名称会自动添加,并被索引。新的字段既可以添加到顶层的映射类型,也可以添加到 objectnested 字段的内部。

显式映射(Explicit mappings)

尽管动态映射在刚开始学习的时候很方便,但是在你比 Elasticsearch 的猜测更了解数据的情况下,指定自己的显示映射更合适。

更新存在的字段映射

除了记录的地方,已经存在的字段映射无法更新。更改映射将意味着使已经存在索引的文档无效。相反,你应该创建一个具有正确映射的新索引,并将数据 重新索引(reindex) 到该索引中。如果您只想重命名字段而不更改其映射,可以使用 别名字段 实现。

举例

当创建索引的时候即可以指定映射,如下:

PUT my_index 
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
'

附录

附1

动态映射

Elasticsearch 最重要的特性特性之一方便上手,让你很快的让你的数据投入使用。为了索引一个文档,你不必走创建索引,定义映射类型,然后定义字段----索引一个文档,然后索引,映射,字段就会自动创建:

PUT data/_doc/1 
{ "count": 5 }
curl -X PUT "localhost:9200/data/_doc/1" -H 'Content-Type: application/json' -d'
{ "count": 5 }
'

注:上面创建了 data 索引,映射类型 _doc,以及字段 count,数据类型为 long。

新字段的自动检测和添加称为动态映射。动态映射规则可以通过以下方式定制,以满足具体的目的:

  1. 动态字段映射:(控制动态字段检测的规则)
  2. 动态模版:(为动态添加的字段配置映射的自定义规则)

注: 索引模版在不管是动态创建,还是显示创建,都允许你配置默认的映射、设置、新索引的别名。
翻译自:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/mapping.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/dynamic-mapping.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值