es Dynamic Mapping

介绍

本章介绍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的控制

引用

https://time.geekbang.org/course/detail/197-105684

你可能感兴趣的:(es Dynamic Mapping)