概述
映射是定义如何索引和存储文档和字段的过程,例如:
- 定义字段类型,哪些字段作为全文索引,哪些字段是数值、日期类型
- 定义日期字段的格式
- 控制动态添加字段的映射的自定义规则
字段类型
- 字符串类型:
(1)text:通常用来存储长文本字段,例如博客标题、内容。通过定义analyzer,实现分词索引。
(2)keyword:不分词的字符串类型,存什么就是什么。 - 数值类型:long、integer、short、byte、double、float
- 日期类型:date
- 布尔类型:boolean
- 复合类型:
(1)object:包含一个子对象
(2)nested:包含一个或多个子对象 - 地理类型:geo_point
- 其他特定类型:ip、completion、join、alias等等
防止映射爆炸
对一个索引定义过多的字段时,可能会导致映射爆炸。也就是说,它将耗费大量的内存空间,甚至是内存溢出报错。为了防止这种情况出现,可以设置以下的属性值:
属性 | 说明 |
---|---|
index.mapping.total_fields.limit | 设置一个索引最多允许有多少字段,默认值是1000 |
index.mapping.depth.limit | 设置字段的最大深度,主要用于限制复合字段类型。默认值是50 |
index.mapping.nested_objects.limit | 设置一个文档最多能有多少nested子对象,防止一个文档对象占用过大的内存空间。默认值是10000 |
index.mapping.field_name_length.limit | 设置字段名称的最大长度,默认不限制 |
动态映射
当你往索引添加的文档数据中,存在mapping不存在的字段时,es会自动将该字段添加到mapping映射中。甚至整个索引都不存在时,也会自动创建索引。这就是动态映射。
举个例子,当前es不存在名称为article的索引,执行如下语法:
POST /article/_doc/1
{
"title":"2020年1月1日天气报告",
"author": "张三",
"comments":[
{
"comment": "不错",
"user": "小张"
},
{
"comment": "有点不准",
"user": "小红"
}
]
}
这时看下索引目录,会发现自动创建了article索引,并且数据也保存了
注意:comments在这里被映射成object类型,如果要使用nested则需要提前做精确映射,而不能使用动态映射。
精确映射
当我们需要自己控制字段类型,而不需要es凭借猜测自动映射,此时就可以使用精确映射。也就是提前创建好mapping,然后再添加数据,这也是目前大多数项目中使用的方式。
这里有一段代码,执行后会创建名称为article的索引:
PUT article
{
"mappings": {
"properties": {
"title":{
"type": "text",
"fields": {
"keyword":{
"type": "keyword"
}
}
},
"author":{
"type": "keyword"
},
"comments":{
"type": "nested"
}
}
}
}
看下跟动态映射的不同之处,这里可以控制为nested。nested和object的区别这里不多介绍了,后面再另外讲解。
给索引添加字段
数据库可以添加字段,elasticsearch这边也同样可以。
语法如下,对article索引添加一个名称为publishOn的字段,类型是date:
PUT /article/_mapping
{
"properties":{
"publishOn":{
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
更新字段类型
elasticsearch不支持更改现有字段的映射或字段类型。
官方建议:
创建一个新索引,并将数据重新索引到该索引中。
查看索引的映射mapping
GET /article/_mapping
得到结果:
{
"article" : {
"mappings" : {
"properties" : {
"author" : {
"type" : "keyword"
},
"comments" : {
"type" : "nested",
"properties" : {
"comment" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"user" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"publishOn" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
}
查看指定字段的映射
GET /article/_mapping/field/title
得到结果:
{
"article" : {
"mappings" : {
"title" : {
"full_name" : "title",
"mapping" : {
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
}
}