什么是Mapping
1. Mapping 类似数据库中的Schema的定义,作用如下
1. 定义索引中字段的名称
2. 定义字段的数据类型,例如字符串,数字,布尔
3. 字段,倒排索引的相关配置
2. Mapping会把JSON文档映射成Lucene所需要的扁平格式
3. 一个Mapping属于一个索引的Type
1. 每个文档都属于一个索引的Type
2. 一个Type有一个Mapping定义
3. 7.0开始,不需要在Mapping定义中指定Type信息
什么是Dynamic Mapping
1. 在写入文档的时候,如果索引不存在,会自动创建索引
2. Dynamic Mapping的机制,使得我们无需手动定义Mappings,ES会根据文档信息,推算出自动的类型
3. 但有时候会推算不对,例如地理位置信息
4. 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
字段的数据类型
1. 简单类型
1. Text/Keyword
2. Date
3. Integer/Floating
4. Boolean
5. IPV4 & IPV6
2. 复杂类型
1. 对象类型
2. 嵌套对象类型
3. 特殊类型
1. geo_point & geo_shape / percolator
类型的自动识别
查看Mapping
在开发工具里面输入以下命令执行:
GET /movies/_mapping
响应结果如下:
{
"movies" : {
"mappings" : {
"properties" : {
"@version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"genre" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"year" : {
"type" : "long"
}
}
}
}
}
能否更改Mapping的字段类型
1. 新增加字段
1. Dynamic 设为true时,一旦有新增字段的文档写入,Mapping也同时被更新
2. Dynamic 设为false时,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_scoure中
3. Dynamic设置为Stict,文档写入失败
2. 对于已有字段,一旦有数据写入,就不再支持修改字段定义
1. Lucene实现的待排索引,一旦生成后,就不允许修改
3. 如果希望改变字段类型,必须Reindex API,重建索引
原因:
1. 如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
2. 但如果是新增的字段,就不会有这样的影响
如何显示的定义一个Mapping
PUT movies
{
"mappings":{
// define your mappings here
}
}
自定义Mapping的一些建议
1. 可以参考API手册,纯手写
2. 为了减少输入的工作量,减少出错概率,可以依照以下步骤:
1. 创建一个临时的Index,写入一些样本数据
2. 通过访问Mapping API获得该临时文件的动态Mapping定义
3. 修改后用,使用该配置创建你的索引
4. 删除临时索引
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。