背景: ES上的原数据接口某字段需要修改类型和配置分词器,但ES不支持修改已存在字段的类型,所以只能重新创建数据结构,且已存在数据不能丢失。

方法:创建新的索引,并创建新的数据结构,将老索引的数据全部迁移到新索引上,然后将给新索引创建别名,别名为老索引,删除老索引,这样线上请求老索引时会映射请求到新索引,使用者感觉不到变化。

1.创建新索引

put 127.0.0.1:9200/newIndex
{
    "mappings": {
        "newIndex": {
            "properties": {
                "businessId": {
                    "type": "long"
                },
                "content": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    },
                    "analyzer":"ik_max_word"
                }
            }
        }
    }
}

2.迁移数据到新索引

post 127.0.0.1:9200/_reindex

{

        "source": {

                "index": "oldIndex"

        },

        "dest": {

                "index": "newIndex"

        }

}

3.创建别名

post 127.0.0.1:9200/_aliases

{

        "actions": [

                {

                        "add" : {

                                "index": "newIndex", 

                                "alias": "oldIndex"

                        }

                }

        ]

4.删除原索引

delete 127.0.0.1:9200/oldIndex 

这样就完成了数据结构的修改,虽然ES里的实际索引名换了,但是请求代码不用更改。 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐