我现在有一个100GB的ES索引。现在我需要将一个字段更改为多个字段,例如:将username
更改为username.username
和username.raw
(not_analyzed
)。我知道这将应用于传入的数据。但是我该如何使此更改影响旧数据?我应该使用索引滚动将整个索引复制到一个新索引中,还是有更好的解决方案只复制一个字段?
我现在有一个100GB的ES索引。现在我需要将一个字段更改为多个字段,例如:将username
更改为username.username
和username.raw
(not_analyzed
)。我知道这将应用于传入的数据。但是我该如何使此更改影响旧数据?我应该使用索引滚动将整个索引复制到一个新索引中,还是有更好的解决方案只复制一个字段?
有一种方法可以在不重新索引所有数据的情况下完成此操作,即使用update by query插件。
基本上,在安装插件后,您可以运行以下查询,并且所有文档都将重新填充多字段。
curl -XPOST 'localhost:9200/your_index/_update_by_query' -d '{
"query" : {
"match_all" : {}
},
"script" : "ctx._source.username = ctx._source.username;"
}'
在处理100GB文档时可能需要一些时间,但是运行后username.raw
字段将被填充。
注意:要使此插件正常工作,需要开启动态脚本功能。
POST index/type/_update_by_query
提交 索引/类型/_update_by_query
{
"query" : {
"match_all" : {}
},
"script" :{
"inline" : "ctx._source.username = ctx._source.username;",
"lang" : "painless"
}
}
这个在 es 5.6 上对我有效,上面那个不行!