tnblog
首页
视频
资源
登录

Dynamic Mapping和常见字段类型

6383人阅读 2020/9/25 12:13 总访问:3467606 评论:1 收藏:0 手机
分类: 云产品

elasticsearch

Elasticsearch Request Body与Query DSL简介

什么是Mapping

Mapping 类似数据库中的schema的定义,作用如下

  • 定义索引中的字段的名称
  • 定义字段的数据类型,例如字符串,数字,布尔……
  • 字段,倒排索引的相关配置,(Analyzed or Not Analyzed)

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

查看 Mapping 的代码如下

  1. GET movies/_mappings

举例

  1. #写入文档,查看Mapping
  2. PUT mapping_test/_doc/1
  3. {
  4. "firstName":"Chan",
  5. "lastName":"Jackie",
  6. "loginDate":"2020-09-25T11:54:00.103Z"
  7. }
  8. #查看 Mapping 文件
  9. GET mapping_test/_mapping
  10. #删除索引
  11. DELETE mapping_test/_doc/1

但我们再下面的举例时,我们发现Elasticsearch所推断出的类型并不准确,从下图来看uid被错误的推断出为text类型,isAdmin同样如此。

  1. #写入文档,查看Mapping
  2. PUT mapping_test/_doc/1
  3. {
  4. "uid":"123",
  5. "isVip":false,
  6. "isAdmin":"true",
  7. "age":19,
  8. "heigh":180
  9. }

类型的自动识别

JSON类型 Elasticsearch 类型
字符串 - 匹配日期格式,设置成 Date
- 配置数字设置为 float 或者 long,该选项默认关闭
- 设置为Test,并且增加 keyword 子字段
布尔值 boolean
浮点数 float
整数 long
对象 Object
数组 由第一个非空数值的类型所决定
空值 忽略

能否更改 Mapping 的字段类型

两种情况

  • 新增加字段
    1. Dynamic设为true时,一旦有新增字段的文档写入,Mapping也同时被更新。
    2. Dynamic设为false时,Mapping不会更新,新增字段的数据无法被索引。
    3. Dynamic设为strict时,文档写入失败
  • 对已有对字段,一旦已经有数据写入,就不再支持修改字段定义
    1. Lucene实现的倒排索引,一旦生成后就不允许修改
  • 如果希望改变字段类型,必须 Reindex API,重建索引
    1. 如果修改了字段的数据类型,会导致已被索引的属性无法被搜索
    2. 但是如果是新增的字段,就不会有这样的影响

控制 Dynamic Mappings

true false strict
文档可索引 YES YES NO
字段可索引 YES NO NO
Mapping被更新 YES NO NO
区别 随便加字段,容易导致添加数据时报错 保留数据,无法更新字段 不能更新字段
  • 当dynamic为false时,存在新增字段的数据可以写入,该数据可以索引,但是新增字段被丢弃。
  • 当设置成 Strict 模式的时候,数据写入直接报错

代码范例

  1. PUT movies
  2. {
  3. "mappings": {
  4. "_doc":{
  5. "dynamic":"false"
  6. }
  7. }
  8. }

举例

  1. #默认Mapping支持dynamic,写入的文档中加入新的字段
  2. PUT dynamic_mapping_test/_doc/1
  3. {
  4. "newField":"someValue"
  5. }
  6. POST dynamic_mapping_test/_search
  7. {
  8. "query": {
  9. "match": {
  10. "newField": "someValue"
  11. }
  12. }
  13. }
  14. #修改为dynamic false
  15. PUT dynamic_mapping_test/_mapping
  16. {
  17. "dynamic": false
  18. }
  19. #新增 anotherField
  20. PUT dynamic_mapping_test/_doc/10
  21. {
  22. "auotherField":"someValue"
  23. }
  24. #该字段不可以被搜索,应为dynamic已经被设置为false
  25. POST dynamic_mapping_test/_search
  26. {
  27. "query": {
  28. "match": {
  29. "auotherField": "someValue"
  30. }
  31. }
  32. }
  33. #Mapping没有更新
  34. GET dynamic_mapping_test/_mapping
  35. #能够被文档索引
  36. GET dynamic_mapping_test/_doc/10
  37. #修改为strict
  38. PUT dynamic_mapping_test/_mapping
  39. {
  40. "dynamic": "strict"
  41. }
  42. #写入数据出错,HTTP Code 400,我们发现不能写入新的字段
  43. PUT dynamic_mapping_test/_doc/12
  44. {
  45. "lastField": "value"
  46. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

尘叶心繁

2020/9/25 14:32:21

扁平格式:具有层级结构,例如像yml那样

这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术