介绍
本章介绍es中的Dynamic Mapping,主要介绍什么是Dynamic Mapping,以及Dynamic Mapping的控制,还是会以demo的例子进行示例。
补充知识
字段的数据类型
- Text/Keyword
- Date
- Integer/Floating
- Boolean
- IPV4 & IPV6
- 复杂类型 对象类型
- geo_point & geo_shape
什么是Mapping
- Mapping类似数据库中schema,有以下的作用
-- 定义索引中的字段
-- 定义索引中字段的数据类型
-- 字段,倒排索引的相关配置 - Mapping会把json文件映射成es中的扁平结构
- 一个Mapping属于一个索引的Type
-- 每个文档都有一个type
-- 每个type都能有一个Mapping定义
-- 7.0开始,不需要在Mapping定义中指定type,因为一个文件在7.0之后只能有一个type
这里主要介绍了Mapping的定义和作用场景
什么是Dynamic Mapping
- 在写入文档的时候,如果索引不存在,会自动创建索引
- Dynamic Mapping的机制,使得我们无需手动定义文档中字段的数据类型,es会根据文档的信息,自动生成推算出文档字段的类型
- 但是有时候依然会出现问题
- 当文档类型设置不符合预期时,就会出现我们预期之外的问题
类型的自动识别
json类型 | es |
---|---|
字符创 | 匹配日期时:data;匹配数字时,为float或long(默认关闭);会被设置为text并且增加keyword |
布尔值 | boolean |
浮点数 | float |
整数 | long |
对象 | Ob |
数组 | 有第一个非空数值的类型锁决定 |
整数 | 忽略 |
Mapping是否可更改
- 新增加字段
- Dynamic被设置为true时,一旦有新增字段写入,Mapping也同时会被更新
- Dynamic被设置为false时,Mapping不会被更新,字段也不会被索引,但是新增字段能出现在_source中
- Dynamic设置为strict,文档写入失败,自然也不能被索引和搜索
- 已有字段
- Lucene实现的倒排索引,一旦生成就无法被修改,除非使用reindex
实例
{
"name":"Li",
"loginDate":"2020-04-13T10:29:48.103Z"
}
先插入一段数据看看Mapping为我们干了啥
GET mapping_test/_mapping

可以看到Name被Mapping成了text,而loginDate则被Mapping成了date类型
删除这个索引,我们重新再建一个看看
PUT mapping_test/_doc/1
{
"uid" : "123",
"isVip" : false,
"isAdmin": "true",
"age":19,
"heigh":180
}

我们可以看到 isAdmin因为置为“true”被Mapping成text类型,isVip得到了正常的boolean类型
#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
通过搜索我们能看到的是

改新增字段能被搜索,也能出现在_source中
接下来我们修改dynamic为false,再新增字段看看
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"anotherField":"someValue"
}
}
}

这个就不能被搜索到了
我们再设置dynamic为strict,再新增字段看看
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
PUT dynamic_mapping_test/_doc/12
{
"lastField":"value"
}

这时候再插入的时候已经报错了
总结
本章通过实例介绍了什么是Dynamic Mapping和Dynamic Mapping的控制
网友评论