Elasticsearch更新映射新增字段后如何拷贝存量已有字段数据到新字段
Elasticsearch 存量数据同步到copy_to字段方案
copy_to 规则仅在文档写入、更新时自动触发,存量文档不会自动把历史值同步到新增的 copy_to 目标字段,你可以直接使用_update_by_query API 触发全量重索引实现存量数据同步,具体操作如下:
1. 基础执行全量重索引
直接执行以下请求,ES会遍历索引内所有存量文档重新执行写入逻辑,自动将first_name、last_name、phone_number的值拷贝到full_name_and_phone_number字段:
POST users/_update_by_query?refresh&wait_for_completion=true
参数说明:
refresh:任务执行完成后自动刷新索引,新字段值立即生效可查询wait_for_completion=true:同步等待任务执行完成,适合数据量较小的场景
2. 大数据量场景优化
如果users索引存量数据超过100万以上,可使用以下优化参数提升执行效率:
POST users/_update_by_query?refresh&wait_for_completion=true&slices=auto&conflicts=proceed
参数说明:
slices=auto:ES自动根据索引分片数分配并行执行的任务数,大幅提升重索引速度conflicts=proceed:遇到文档版本冲突时不中断任务,继续执行剩余文档的重索引
如果数据量极大不想同步等待,可以将wait_for_completion改为false,请求会立即返回任务ID,你可后续通过任务查询接口查看执行进度。
3. 结果验证
执行完成后可执行以下请求验证新字段是否已经赋值成功:
GET users/_search { "query": { "exists": { "field": "full_name_and_phone_number" } }, "size": 10 }
确认结果符合预期后,即可替换原有多字段查询逻辑,改为仅查询单个full_name_and_phone_number字段提升搜索效率。
内容的提问来源于stack exchange,提问作者Jagveer Singh
相关产品推荐
相关产品推荐

