1.什么是Mapping
Mapping 类似 mysql 中的 schema 的定义
用于定义索引属性字段的名称、字段的数据类型 (如 text , long , keyword…)、字段的倒排索引相关配置
一个Mapping 属于一个索引的Type、每个文档都属于一个Type
es7.0开始, 在Mapping中不需要指定 Type信息, 因为7.0之后只有_doc Type
2.自动创建Mapping
当我们去创建一个 索引的时候 未指定 mapping , es会默认帮这个索引创建一个 mapping
例:创建一个索引testmapping
创建一个空索引:
PUT testmapping
创建成功:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "testmapping"
}
查询该索引mapping信息:
GET testmapping/_mapping
返回结果:
{
"testmapping" : {
"mappings" : {
}
}
}
此时可以看到ES为我们创建了一个空mapping的索引,如果我们在创建索引的时候指定字段,ES也会生成我们指定的字段类型,或者默认的类型
创建名为user的索引,并指定字段及字段类型
PUT /user
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"language": {
"type": "keyword"
},
"price": {
"type": "double"
},
"publish_time": {
"type": "date",
"format": "yyy-MM-dd"
}
}
}
}
获取user的mapping信息
GET user/_mapping
{
"user" : {
"mappings" : {
"properties" : {
"language" : {
"type" : "keyword"
},
"price" : {
"type" : "double"
},
"publish_time" : {
"type" : "date",
"format" : "yyy-MM-dd"
},
"title" : {
"type" : "text",
"analyzer" : "ik_max_word"
}
}
}
}
}
动态映射(dynamic mapping)
关系型数据库: 先创建表 => 指定字段和字段类型 => 数据写入表
在ES中,索引就相当于表,文档就相当于记录,文档里面的字段就相当于表的字段,字段同样有数据类型。mapping就用来定义文档有哪些字段,这些字段如何存储和索引。
ES与关系型数据库不同之处在于: 其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。这提供了极大的灵活性。
注:一个索引的字段数量有上限的,超过上限就会报错(默认单个索引创建最大1000个字段)
dynamic参数设置:
按dynamic值,可分为下面三种模式
动态模式(dynamic:true),根据输入文档的内容,自动推断字段和类型,创建mapping
非动态模式(dynamic:false),无法根据输入文档的内容,自动创建mapping,需要手动创建mapping
严格模式(dynamic:strict),同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。
1.动态模式
直接对一个不存在的索引插入一条数据
POST dynamictrue/_doc
{
"name": "张三",
"age": 15
}
插入成功,获取该索引的mapping信息
GET dynamictrue/_mapping
{
"dynamictrue" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
在动态模式下,ES会根据插入的数据自动生成对应的字段类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网
1.1动态模式下索引文档
GET dynamictrue/_search
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" :