前言
由于团队中的小伙伴,将ElasticSearch的keyword类型字段创建为Text类型,导致其他小伙伴通过match或term查询怎么查也查不到,所以需要去修改Elasticsearch索引字段类类型;但是ElasticSearch没有像关系型数据库一样可以直接修改字段数据类型的方法;
一、修改思路如下
1、获取源索引的数据(mapping) 并 创建临时索引:data_index_temp,
2、备份数据到临时索引:data_index_temp
3、删除原索引: data_index,
4、重新创建正确数据类型索引:data_index
5、再把临时索引:data_index_temp的数据备份到新创建索引 data_index。
以上语句通过kibana的 dev_tools/console 执行。
见图
二、操作步骤
- 获取源索引的数据(mapping)
- 创建一个临时索引,并复制源索引的mapping数据
- 复制源索引的数据值临时索引,并查询确认数据是否复制过去
- 删除有问题的索引
- 重新创建同名的索引(注意:字段类型修改正确)
- 从临时索引还原到源索引的数据
- 删除临时索引
以下简单做个示例
1.获取源索引的数据(mapping)
代码如下(示例):
//获取源索引的mapping数据
GET data_index/_mapping
//返回示例如下
{"data_index": {
"mappings": {
"cdp_doc": {
"properties": {
"whyBuy": {
"type": "keyword"
},
"zipcode": {
"type": "keyword"
}
}
}
}
}
2. 创建一个临时索引,并使用源索引的mapping数据
代码如下(示例):
//# 创建Mapping
PUT data_index_temp
{
"mappings": {
"cdp_doc": {
"properties": {
"whyBuy": {
"type": "keyword"
},
"zipcode": {
"type": "keyword"
}
}
}
}
}
3. 复制源索引的数据至临时索引,并查询确认数据是否复制过去
代码如下(示例):
//# 创建Mapping
PUT data_index_temp
{
"mappings": {
"cdp_doc": {
"properties": {
"whyBuy": {
"type": "keyword"
},
"zipcode": {
"type": "keyword"
}
}
}
}
}
// 同步数据值临时索引
POST _reindex?refresh&wait_for_completion=false
{
"conflicts": "proceed",
"source": {
"index": "data_index"
},
"dest": {
"index": "data_index_temp",
"op_type": "create"
}
}
//查询确认数据是否复制过去
GET data_index_temp/_search
{
"query": {
"term": {
}
}
}
4. 删除有问题的索引
//删除索引及数据
delete cdp_elelc_customer
5. 重新创建同名的索引(注意:字段类型修改正确)
步骤同第2步
6. 从临时索引还原至源索引的数据
步骤同第3步
7. 删除临时索引
步骤同第4步