Elasticsearch 可以更改 Mapping 吗?如何修改?

r660926
发布于 2022-4-20 14:16
浏览
0收藏

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区
最近几个线上问题,都和 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 更新问题,我们一起梳理实践一把。

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

问题1:Mapping新创建后,还可以更新吗?
官方文档有强调:

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

也就是说,已经定义的字段大多数情况不能被更新,除非 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 特例情况实战一把。

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

更新 Mapping 操作如下示例:

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

以上:

 

对应第一种情况,Object 对象可以添加新的属性。我们添加了 last 字段。

 

对应第二种情况,first 添加了keyword 类型,以组合构造fields。

 

对应第三种情况,user_id 添加了ignore_above。

 

这三种 Mapping 更新特列情况,大家需要掌握。实战环节不需要 reindex 就可以更新 Mapping,还是非常便捷的。

 

问题2:如何给索引新增、删除字段?

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区
强调一下:

 

 •  Mapping 中已有的字段是不可以删除的,除非 reindex。


 •  Mapping 字段设置默认是 "dynamic:true",表明支持动态添加字段。


更新 Mapping 添加字段举例如下:

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

dynamic 设置值及含义如下表所示:

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

可以将问题进一步提炼转换为:修改 Mapping 字段类型。

Mapping 字段是不可以直接更新的,但我们可以“曲线救国”。

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

解读一下:

 

第一步:新增了字段 bflag,且设置为 boolean 类型。

 

第二步:自建 ingest 预处理管道,结合原有 sflag 字段更新新增的 bflag 字段。

 

第三步:全量批量更新已有索引,实现字段的更新。

 

自此,“曲线救国”达到目的,如下图所示,bflag 设置成了 boolean 值。

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

问题4:join 类型添加新 child 如何实现?


Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

实践一把,给出答案。

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

上面的更新 Mapping 部分,由 1 对 1 的父子关联关系,转化为:1 对 4 的父子关联关系,如下图所示:

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区

Elasticsearch 可以更改 Mapping 吗?如何修改?-鸿蒙开发者社区
Mapping 字段的 dynamic 特性有利有弊,要结合业务场景选型,对不希望动态扩展字段以至字段“膨胀”的场景下,建议设置为 strict。

 

Mapping 创建后,已有字段不可以修改,但可以“曲线救国”实现字段更新,间接实现字段的“修改”。

 

Mapping 中已有字段更新的三个特列要掌握。

 

Runtime field 运行时类型也能很好的解决本文提出的动态扩展字段的问题,鉴于篇幅原因,本文没有展开。更多 runtime field 实战解读,推荐阅读:


Elasticsearch 运行时类型 Runtime fields 深入详解

 

 

分类
收藏
回复
举报
回复
    相关推荐