Elasticsearch 可以更改 Mapping 吗?如何修改?
1、实战线上问题
最近几个线上问题,都和 Mapping 字段更新有关系,问题列表如下:
问题 1:
Mapping新创建后,还可以更新吗?
问题 2:
群友 A:有人知道怎么在kibana里面给索引新增,删除字段吗?
群友 B: 不就是改 mapping 吗
群友 A:怎么改?
群友 B:写dsl啊…
群友 A:只能加不能删吧?
问题 3:
各位同学们 现在有个业务需求帮忙看一下?
需求:将 A 索引中一个为 String 的字段修改为 boolean。
例: sdry:"1" -> sdry:true。
问题 4:
join 类型怎么修改 join,append一个新的child?
业务需要 append join children,官方也说可以 append,但是又没给方案,我尝试都失败了。
四个问题都可以归结为 Mapping 更新问题,我们一起梳理实践一把。
2、问题拆解解读
问题1:Mapping新创建后,还可以更新吗?
官方文档有强调:
In general, the mapping for existing fields cannot be updated. There are some exceptions to this rule.
也就是说,已经定义的字段大多数情况不能被更新,除非 reindex 更新 mapping。
但,以下三种情况例外。
第一:new properties can be added to Object fields.
Object 对象可以添加新的属性。
第二: new multi-fields can be added to existing fields.
已经存在的fields里面可以添加fields,以构成一个字段多种类型。
第三:the ignore_above parameter can be updated.
ignore_above 是可以更新的。
问题 1 特例情况实战一把。
DELETE my_index
PUT my_index
{"mappings": {"properties": {"name": {"properties": {"first": {"type": "text"}}},"user_id": {"type": "keyword"}}}
}
更新 Mapping 操作如下示例:
PUT my_index/_mapping
{"properties": {"name": {"properties": {"first":{"type":"text","fields":{"field":{"type":"keyword"}}},"last": { "type": "text"}}},"user_id": {"type": "keyword","ignore_above": 100}}
}
以上:
对应第一种情况,Object 对象可以添加新的属性。我们添加了 last 字段。
对应第二种情况,first 添加了keyword 类型,以组合构造fields。
对应第三种情况,user_id 添加了ignore_above。
这三种 Mapping 更新特列情况,大家需要掌握。实战环节不需要 reindex 就可以更新 Mapping,还是非常便捷的。
问题2:如何给索引新增、删除字段?
有人知道怎么在kibana里面给索引新增,删除字段吗?
强调一下:
Mapping 中已有的字段是不可以删除的,除非 reindex。
Mapping 字段设置默认是 "dynamic:true",表明支持动态添加字段。
更新 Mapping 添加字段举例如下:
DELETE my-index-003
#创建索引同时指定 Mapping
PUT my-index-003
{"mappings": {"properties": {"message": {"type": "keyword","ignore_above": 20}}}
}
#更新 Mapping
POST my-index-003/_mapping
{"properties": {"title": {"type": "text","analyzer": "ik_max_word"}}
}
dynamic 设置值及含义如下表所示:
属性值 | 含义 |
---|---|
true | 默认,支持动态更新 |
false | 忽略新增字段 |
strict | 严格定义字段,类似写死固定字段,再新增未设定字段会报错 |
runtime | 和默认true有细微差别,参见官方文档 |
问题 3:string 类型改成 boolean 类型,如何实现?
各位同学们 现在有个业务需求帮忙看一下。
需求:将 A 索引中一个为 String 的字段修改为 boolean。
例:sdry:"1" -> sdry:true
可以将问题进一步提炼转换为:修改 Mapping 字段类型。
Mapping 字段是不可以直接更新的,但我们可以“曲线救国”。
# 创建索引
PUT test-002
{"mappings": {"properties": {"sflag":{"type":"keyword"}}}
}# 模拟写入数据
PUT test-002/_bulk
{"index":{"_id":1}}
{"sflag":"1"}
{"index":{"_id":2}}
{"sflag":"0"}# 更新Mapping
POST test-002/_mapping
{"properties":{"bflag":{"type":"boolean"}}
}# 对新增字段做数据处理
PUT _ingest/pipeline/mychangepipeline
{"processors":[{"script": {"description": "Extract 'tags' from 'env' field","lang": "painless","source": """if(ctx['sflag'] == "1"){ctx['bflag']=true;}else if(ctx['sflag']=="0"){ctx['bflag']=false;}"""}}]
}# 全量更新操作
POST test-002/_update_by_query?pipeline=mychangepipeline
{"query": {"match_all": {}}
}# 检索结果
POST test-002/_search
解读一下:
第一步:新增了字段 bflag,且设置为 boolean 类型。
第二步:自建 ingest 预处理管道,结合原有 sflag 字段更新新增的 bflag 字段。
第三步:全量批量更新已有索引,实现字段的更新。
自此,“曲线救国”达到目的,如下图所示,bflag 设置成了 boolean 值。
问题4:join 类型添加新 child 如何实现?
join 类型怎么修改 join,append一个新的child?
业务需要 append join children,官方也说可以 append,但是又没给方案,我尝试都失败了。
实践一把,给出答案。
DELETE test-join-index
# 创建父子文档关联索引
PUT test-join-index
{"mappings": {"properties": {"my_id": {"type": "keyword"},"my_join_field": {"type": "join","relations": {"question": "answer_a"}}}}
}# 更新 Mapping
POST test-join-index/_mapping
{"properties": {"my_join_field": {"type": "join","relations": {"question": ["answer_a","answer_b","answer_c","answer_d"]}}}
}
上面的更新 Mapping 部分,由 1 对 1 的父子关联关系,转化为:1 对 4 的父子关联关系,如下图所示:
3、小结
Mapping 字段的 dynamic 特性有利有弊,要结合业务场景选型,对不希望动态扩展字段以至字段“膨胀”的场景下,建议设置为 strict。
Mapping 创建后,已有字段不可以修改,但可以“曲线救国”实现字段更新,间接实现字段的“修改”。
Mapping 中已有字段更新的三个特列要掌握。
Runtime field 运行时类型也能很好的解决本文提出的动态扩展字段的问题,鉴于篇幅原因,本文没有展开。更多 runtime field 实战解读,推荐阅读:
Elasticsearch 运行时类型 Runtime fields 深入详解
推荐
1、重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)
2、Elasticsearch 7.X 进阶实战私训课(口碑不错)
更短时间更快习得更多干货!
已带领72位球友通过 Elastic 官方认证!
中国仅通过百余人
比同事抢先一步学习进阶干货!
Elasticsearch 可以更改 Mapping 吗?如何修改?相关推荐
- 记一次ElasticSearch 更改 mapping 字段类型的过程
我的个人博客:逐步前行STEP 首先,es不支持直接更改mappinng,所以,更改 mapping 实质上是重建索引. 操作步骤如下: 1.为当前这个索引old_index设置一个别名my_inde ...
- elasticsearch 7.4 mapping及常见参数
1. 对Mapping的理解 Mapping类似于关系型数据库的Schema,主要包含以下内容: 定义索引中字段的名称 定义字段的数据类型,如:字符串.数字.boolean等 可对字段设置倒排索引的相 ...
- 一文搞懂Elasticsearch索引的mapping与setting
目录 Elasticsearch索引结构 Mapping Setting Elasticsearch索引结构 一个Elasticsearch索引的主要结构如下: {"test_index&q ...
- ES 11 - 配置Elasticsearch的映射 (mapping)
目录 1 映射的相关概念 1.1 什么是映射 1.2 映射的组成 1.3 元字段 1.4 字段的类型 2 如何配置mapping 2.1 创建mapping 2.2 更新mapping 2.3 查看m ...
- Java ElasticSearch:(五)ElasticSearch 中的 mapping 问题
ElasticSearch 中的 mapping 问题 1.mapping 核心数据类型 2.dynamic mapping 对字段的类型分配 3.查看索引 mapping 4.custom mapp ...
- ORA-01439: 要更改数据类型, 则要修改的列必须为空
场景: 修改数据库字段类型 执行的SQL: ALTER TABLE TABLE_NAME MODIFY (RIGHT_RANGE VARCHAR2(20)); 报错: ORA-01439:要更改数据类 ...
- iPhone手机美化篇--字体更改及字体颜色修改
字体更改及字体颜色修改 1.字体修改 系统字体分为三种:系统中文字体.系统数字和英文字体.锁屏时候桌面显示的那个大时间字体. 替换路径 ://System/Library/Fonts/Cache S ...
- 批量处理图形大小如何更改图片大小尺寸修改图片视频教程ps学习ps教程ps基础新教程
批量处理图形大小如何更改图片大小尺寸修改图片视频教程ps学习ps教程ps基础新教程
- java 修改文件创建时间_Java如何更改文件的最后修改时间?
在java编程中,如何更改文件的最后修改时间? 此示例显示如何使用File类中的FileToChange.lastModified()和fileToChange setLastModified()来更 ...
最新文章
- Java过滤特殊字符的正则表达式
- 模拟退火算法理论+Python解决函数极值+C++实现解决TSP问题
- 初学Java Web——Servlet(一)
- 2022年全球及中国真空用光纤馈通件行业运营形式与未来投资动向调研报告
- 【ABAP】ALV可编辑数据更新
- Linux权限管理总结(1)--基础权限
- HTML期末作业-宠物网
- 在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题)
- EqualLogic强势增长,戴尔领跑iSCSI中国及香港地区市场
- 2019秋季学期第2周Java学习总结
- 怎么在电脑上看磁盘分配单元的大小_不升级配件、4种方法让电脑提速50%!
- envi 打开影像报错:‘HISTOGRAM:illegal binsize or max/min‘.The result maybe invalid
- DBA 常用的软件工具有哪些(分享篇)?
- TextToSpeech文本转语音,从开始说话到结束的监听
- MD5加密算法特点及简单实现(Java)
- 台式计算机操作系统的安装方法,台式电脑显卡散热器的更换及安装方法教程[多图]...
- MongoDB Mobile Sync for iOS推出Beta版本
- Java_定义一个圆类,提供输出面积和周长的方法,定义一个测试类使用
- 【总目录】人工智能、机器学习、深度学习总结大全----目录.未完待续...
- 电商指标项目-背景及技术选型
热门文章
- linux centos7.x 编译安装php7.4.2
- 你们一个个都人工智能了,让PC怎么办?
- bat中rar压缩命令
- MikTex中如何使用BibTeX添加参考文献
- Github 之 本地上传代码到 Github ,并且添加 .gitignore 文件 屏蔽一些文件上传(内附详细步骤)
- 完美解决移动端video视频层级问题
- 实训1 构建一个计算列表中位数的函数
- 基于主从博弈的智能小区电动汽车充电管理及代理商定价策略
- 视频、图形图像处理之Opencv技术记录(四)、OpenCV教程概述
- 【推荐系统】DUPN:Deep User Perception Network