如何将ElasticSearch字段复制到另一个字段

4

我现在有一个100GB的ES索引。现在我需要将一个字段更改为多个字段,例如:将username更改为username.usernameusername.raw(not_analyzed)。我知道这将应用于传入的数据。但是我该如何使此更改影响旧数据?我应该使用索引滚动将整个索引复制到一个新索引中,还是有更好的解决方案只复制一个字段?


1
你需要重新索引该索引中的所有文档。创建一个新的索引并在其中重新索引所有内容,或者删除当前索引并使用新映射从头开始重新创建它。 - Andrei Stefan
2个回答

4

有一种方法可以在不重新索引所有数据的情况下完成此操作,即使用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字段将被填充。

注意:要使此插件正常工作,需要开启动态脚本功能。


你不觉得这会给集群带来一些压力吗?因为它允许在段中删除大量文档。根据合并行为,可能会在单个段中有大量已删除的文档,从而占用磁盘空间,并且还会影响(在某些情况下可能是相关的)搜索性能。 - Andrei Stefan
绝对同意。不过,如果这种部分重新索引与一些事后重新优化明智地结合起来,那么已删除文档的段应该会被消除。值得注意的是,在同一个索引中进行完全重新索引将具有相同的效果。最终,我的直觉告诉我,通过查询更新+优化所需的时间比从头开始重新创建索引要少,但这只是基于我过去做同样事情的经验。 - Val
1
优化必须使用max_num_segments = 1。100 GB的文档需要一些时间来进行优化。在我看来,如果数据存储在其他地方且可以从该位置重新索引,则删除索引并重新创建它肯定比更新每个文档然后进行优化要快得多。 - Andrei Stefan

0

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 上对我有效,上面那个不行!


这是对Val答案的评论,而不是答案本身。 - user732456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接