动态映射
当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping
来确定字段的数据类型并自动把新的字段添加到类型映射。有时这是想要的行为有时又不希望这样。
可以用 dynamic
配置来控制这种行为 ,可接受的选项如下:
-
true
动态添加新的字段(默认true) -
false
忽略新的字段 -
strict
如果遇到新字段抛出异常
demo1
# 1. 创建文档,自动创建映射
PUT my_index/_doc/1
{
"username": "johnsmith",
"name": {
"first": "John",
"last": "Smith"
}
}
GET my_index/_mapping
# 2. 此时mapping信息如下:
{
"my_index" : {
"mappings" : {
"properties" : {
"name" : {
"properties" : {
"first" : { .....},
"last" : { .....}
}
},
"username" : { ...}
}
}
}
}
#3. 插入新的字段 middle
PUT my_index/_doc/2
{
"username": "marywhite",
"email": "mary@white.com",
"name": {
"first": "Mary",
"middle": "Alice",
"last": "White"
}
}
#4. mapping 变化,增加了 name.middle field配置
GET my_index/_mapping
动态映射配置说明
dynamic
可以在映射类型
级别和每个内部对象
上设置.内部对象从其父对象或映射类型继承设置。
PUT my_index
{
"mappings": {
"dynamic": false, # 在`类型级别`禁用动态映射,因此不会动态添加新的 顶级字段。
"properties": {
"user": { # user 对象继承`类型级别`设置。
"properties": {
"name": {
"type": "text"
},
"social_networks": { # user.social_networks 对象启用动态映射,因此可以向该内部对象添加新字段。
"dynamic": true,
"properties": {}
}
}
}
}
}
}
自定义动态映射
在运行时增加新的字段,你可能会启用动态映射。然而,有时候,动态映射规则
可能不太智能。幸运的是,我们可以通过设置去自定义这些规则,以便更好的适用于你的数据。
日期检测
当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如2014-01-01
。如果它像日期,这个字段就会被作为date
类型添加。否则,它会被作为 string 类型添加。
有些时候这个行为可能导致一些问题。想象下,你有如下这样的一个文档:
# 假设这是第一次识别 note 字段,它会被添加为 date 字段。
{ "note": "2014-01-01" }
# 第二次:这显然不是一个日期,但为时已晚。这个字段已经是一个日期类型,这个 不合法的日期 将会造成一个异常。
{ "note": "Logged out" }
日期检测可以通过在根对象上设置date_detection 为 false
来关闭(默认为true):
PUT my_index
{
"mappings": {
"date_detection": false
}
}
dynamic_date_formats
如果date_detection 已启用(默认)
,则检查新字符串字段以查看其内容是否与dynamic_date_formats
中指定的任何日期模式匹配。 如果找到匹配项,则会添加具有相应格式的新日期字段。dynamic_date_formats
默认值是:
[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
自定义dynamic_date_formats
PUT my_index
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
数值检测
PUT my_index
{
"mappings": {
"numeric_detection": true # 默认为false
}
}
PUT my_index/_doc/1
{
"my_float": "1.0", # 作为float字段添加。
"my_integer": "1" # 作为long字段添加。
}