Elasticsearch修改字段类型方案

Elasticsearch的mapings相当于数据库的表结构,在使用过程中可以新增和删除字段,但是不支持修改字段类型,可以通过以下四个步骤来实现
  1. 创建新的目标index
  2. 将源index的数据复制到目标index
  3. 删除源index
  4. 给目标index设置别名,别名为源index的名称。
    或者再建一个名称为源index的目标index2,数据从目标index复制到目标index2
下面举个例子Elasticsearch修改字段类型方案
文章图片

源index: my-index-order-1
包含两个字段:
  • createTime: 下单时间,类型:long
  • orderNo: 订单号,类型:text
以下操作都是在Kinbana的控制台中执行.
PUT /my-index-order-1?pretty { "mappings": { "properties": { "createTime": { "type": "long" }, "orderNo": { "type": "text" } } } }

插入三条数据
PUT /my-index-order-1/_doc/1?pretty { "createTime": 1637992973517, "orderNo": "7d7d5495-4db9-4513-a2c9-c5fb0454517e" } PUT /my-index-order-1/_doc/2?pretty { "createTime": 1637993092000, "orderNo": "fb337ede-6e1d-4422-8e2b-453148064bba" } PUT /my-index-order-1/_doc/3?pretty { "createTime": 1640585092000, "orderNo": "54ccb3a9-c168-487e-8594-893a2b7803bf" }

需求分析:把my-index-order-1的createTime字段类型从long类型修改成date类型 1. 创建新的目标index
PUT /my-index-order-2?pretty { "mappings": { "properties": { "createTime": { "type": "date" }, "orderNo": { "type": "text" } } } }

2. 将源index的数据复制到目标index reindex 命令可以实现两个index之间数据的拷贝,
两个index的mappings不同,只会拷贝互相兼容的数据。
如果复制的数据量比较大,_reindex请求会超时,不要着急,数据拷贝还在继续,
可以通过GET _tasks?detailed=true&actions=*reindex命令查询正在执行的任务,
GET _tasks/taskId:number查询某一个任务的执行详情。
reindex更多参数参考官方文档:
https://www.elastic.co/guide/...
POST _reindex { "source": { "index": "my-index-order-1" }, "dest": { "index": "my-index-order-2" } }

3. 删除源index DELETE /my-index-order-1/
4. 给目标index设置别名,别名为源index的名称 给my-index-order-2加上my-index-order-1的别名后,可以直接通过my-index-order-1来操作my-index-order-2
POST _aliases { "actions":[ { "add":{ "index":"my-index-order-2", "alias":"my-index-order-1" } } ] }

到此完成mappings字段类型的修改。可以愉快的对createTime做时间的统计查询了
比如统计每个月的下单量:
GET /my-index-order-2/_search?pretty { "size": 0, "aggs": { "orderCount": { "date_histogram": { "field": "createTime", "calendar_interval": "1M", "format": "yyyy-MM" } } } }

查询结果:
{ "took": 27, "timed_out": false, "_shards": { .... }, "hits": { .... }, "aggregations": { "orderCount": { "buckets": [ { "key_as_string": "2021-11", "key": 1635724800000, "doc_count": 2 }, { "key_as_string": "2021-12", "key": 1638316800000, "doc_count": 1 } ] } } }

【Elasticsearch修改字段类型方案】Elasticsearch 版本号: 7.15.2
Kibana 版本号: 7.15.2
Elasticsearch 中文官网 https://www.elastic.co/cn/

    推荐阅读