【ElasticSearch入门】5、Dynamic Mapping、常见字段类型、显式mapping
一、Mapping
Mapping 类似数据库的 schema 的定义,作用如下:
- 定义索引中的字段名称
- 定义字段的数据类型,例如字符串,数字,布尔…
- 字段,倒排索引的相关配置,(Analyzed or Not Analyzed,Analyzer)
Mapping 会把 JSON 文档映射称 Lucene 所需的扁平格式
一个 Mapping 属于一个索引的 Type
- 每个文档都属于一个 Type
- 一个 Type 有一个 Mapping 定义
- 7.0 开始,不需要在 Mapping 定义指定 type 信息
字段的数据类型
简单类型
- Text / Keyword
- Date
- Integer / Floating
- Boolean
- IPv4 & IPv6
复杂类型 - 对象和嵌套对象
- 对象类型 / 嵌套类型
特殊类型
- geo_point & geo_shape / percolator
二、dynamic mapping
在写入文档的时候,如果索引不存在,会自动创建索引。
Dynamic Mapping 的机制,使得我们无需手动定义 Mappings。Elasticsearch 会自动根据文档信息,推算出字段的类型。
但是会有时候推算不对。例如地理位置信息。
当类型如果设置不对时,会导致一些功能无法正常运行,例如 Range 查询。
类型的自动识别
demo
#写入文档,查看 Mapping
PUT mapping_test/_doc/1
{
"firstName":"Chan",
"lastName": "Jackie",
"loginDate":"2018-07-24T10:29:48.103Z"
}
#查看 Mapping文件
GET mapping_test/_mapping
比如说isAdmin 这里查看来说他的type是text,但是我们写的是字符串的true
能否更改 Mapping 的字段类型
两种情况
新增字段
- Dynamic 设置为 true 时,一定有新增字段的文档写入,Mapping 也同时被更新
- Dynamic 设为 false,Mapping 不会被更新,自增字段的数据无法被索引,但是信息会出现在_source 中
- Dynamic 设置成 Strict 文档写入失败
对已有字段,一旦已经有数据写入,就不在支持修改字段定义
- Luene 实现的倒排索引,一旦生成后,就不允许修改
- 如果希望改变字段类型,必须 Reindex API,重建索引
原因
如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
但是如果是增加新的字段,就不会有这样的影响。
#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
#该字段可以被搜索,数据也在_source中出现
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
可以搜索到相关的信息。
下面将dynamic改为false,并新增字段
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
#该字段不可以被搜索,因为dynamic已经被设置为false
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"anotherField":"someValue"
}
}
}
字段无法被检索。
#修改为strict
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
#写入数据出错,HTTP Code 400
PUT dynamic_mapping_test/_doc/12