ES-动态映射

https://www.elastic.co/guide/en/elasticsearch/reference/7.6/dynamic-field-mapping.html

动态映射

当 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字段添加。
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值