Elasticsearch更新内容及备份
如何备份并更改现有Mapping或是数据
1. 新增字段
如果需要在已有索引中新增字段,可以直接使用 PUT 请求来更新映射。新增字段不会影响已有的数据。
# 假设索引名为 `my_index`
new_mapping = {
"properties": {
"new_field": {
"type": "text"
}
}
}
es.indices.put_mapping(index="my_index", body=new_mapping)
2. 修改字段属性
修改字段的类型
Elasticsearch 不允许直接更改字段的类型。例如,无法将 text 字段改为 keyword 类型。要实现字段类型的修改,需要重建索引。
修改字段的属性
可以对部分字段的属性进行修改,比如将 text 类型字段的 analyzer 变为自定义分词器,但仅适用于特定字段的属性,以下是一些示例。
# 示例:修改分词器属性
update_mapping = {
"properties": {
"title": {
"type": "text",
"analyzer": "my_custom_analyzer" # 更新自定义分词器
}
}
}
es.indices.put_mapping(index="my_index", body=update_mapping)
请注意,更新某些属性(如 analyzer)会导致新的文档使用更新后的配置,但已有文档不会重新索引,因此更新效果仅限于新增数据。
3. 重建索引以更改映射
当需要更改字段类型或进行复杂的映射更改时,需要通过重建索引的方式来实现。这通常包括以下步骤:
- 创建新索引:按照新的映射创建一个新的索引。
- 数据迁移:将旧索引的数据迁移到新索引。
- 切换索引别名(可选):切换别名,使应用无缝切换到新索引。
- 删除旧索引(可选):确认无误后,删除旧索引。
以下是详细步骤:
3.1 创建新索引
# 定义新的映射
new_mapping = {
"mappings": {
"properties": {
"title": {
"type": "keyword" # 改为 keyword 类型
},
"description": {
"type": "text"
},
# 其他字段保持不变或进行新的配置
}
}
}
# 创建新索引(假设新索引名为 `my_index_v2`)
es.indices.create(index="my_index_v2", body=new_mapping)
3.2 数据迁移
可以使用 reindex API 将数据从旧索引迁移到新索引:
# 使用 reindex API 迁移数据
reindex_body = {
"source": {
"index": "my_index" # 旧索引
},
"dest": {
"index": "my_index_v2" # 新索引
}
}
es.reindex(body=reindex_body, wait_for_completion=True)
3.3 切换索引别名(可选)
如果系统中使用了别名,可以将别名指向新索引,以实现应用无缝切换。
# 切换别名
actions = [
{"remove": {"index": "my_index", "alias": "my_index_alias"}},
{"add": {"index": "my_index_v2", "alias": "my_index_alias"}}
]
es.indices.update_aliases(body={"actions": actions})
这样,应用可以继续通过 my_index_alias 别名访问数据,不需要感知底层索引的变化。
3.4 删除旧索引(可选)
确认新索引工作正常后,可以删除旧索引以释放存储空间。
# 删除旧索引
es.indices.delete(index="my_index")
注意事项
- 重建索引:更改字段类型或复杂的映射更改时,必须使用重建索引的方式。直接更新映射将会失败。
- 更新映射的限制:更新映射后仅影响新写入的文档,已有文档不会重新索引。因此,如果需要映射立即生效,需要重建索引或手动重新索引数据。
- 分片数不可更改:Elasticsearch 中的索引一旦创建,分片数不可修改,若需更改分片数只能重建索引。
- 数据备份:在进行重建索引等重要操作前,建议备份数据以避免数据丢失风险。
评论
目录