【ElasticSearch入门】5、Dynamic Mapping、常见字段类型、显式mapping以及自定义分词器

【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 查询。

类型的自动识别

img

demo

#写入文档,查看 Mapping
PUT mapping_test/_doc/1
{
   
  "firstName":"Chan",
  "lastName": "Jackie",
  "loginDate":"2018-07-24T10:29:48.103Z"
}
 
#查看 Mapping文件
GET mapping_test/_mapping

image-20220519204743760

比如说isAdmin 这里查看来说他的type是text,但是我们写的是字符串的true

能否更改 Mapping 的字段类型

两种情况

新增字段

  • Dynamic 设置为 true 时,一定有新增字段的文档写入,Mapping 也同时被更新
  • Dynamic 设为 false,Mapping 不会被更新,自增字段的数据无法被索引,但是信息会出现在_source 中
  • Dynamic 设置成 Strict 文档写入失败

对已有字段,一旦已经有数据写入,就不在支持修改字段定义

  • Luene 实现的倒排索引,一旦生成后,就不允许修改
  • 如果希望改变字段类型,必须 Reindex API,重建索引

原因
如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
但是如果是增加新的字段,就不会有这样的影响。

img

img

#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
   
  "newField":"someValue"
}
 
#该字段可以被搜索,数据也在_source中出现
POST dynamic_mapping_test/_search
{
   
  "query":{
   
    "match":{
   
      "newField":"someValue"
    }
  }
}

image-20220519210501393

可以搜索到相关的信息。

下面将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"
    }
  }
}

字段无法被检索。

image-20220519210549918

#修改为strict
PUT dynamic_mapping_test/_mapping
{
   
  "dynamic": "strict"
}
#写入数据出错,HTTP Code 400
PUT dynamic_mapping_test/_doc/12
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值