如何在 Elasticsearch 中高效地重命名字段名?

3

我一直在使用以下查询来重命名fieldName。

POST http://localhost:9200/INDEX_NAME/_update_by_query
{
    "query": { 
        "exists": {
            "field": "NEW_FIELD_NAME"
        }
    },
    "script" : {
        "inline": "ctx._source.NEW_FIELD_NAME = ctx._source.OLD_FIELD_NAME; ctx._source.remove(\"OLD_FIELD_NAME\");"
    }
}

但是对于超过420万数据,需要大约2-3分钟的时间。

有没有任何方法可以缩短持续时间?

ElasticSearch版本为5.6.4


收到回复 discuss.elastic.co - Haridoss M
2个回答

0

David在Discuss上的回答是一种较为困难的方法。如果你正在寻找一种简单的方法,并且你的索引有多个主分片,那么你可以使用slicing来并行化工作:

POST http://localhost:9200/INDEX_NAME/_update_by_query?slices=auto&wait_for_completion=false
{
    ...
}

但是David说得对,你应该在某个时候升级 ;-)


0

一种完全不同的方法,可以确保零停机时间,即首先创建一个新的索引映射,其中包含更新后的字段名。

然后,您可以使用重新索引API将数据填充到此新索引中。 https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html

假设您正在使用别名,一旦重新索引完成,您就可以更新此别名的基础索引。 这将确保在使用此数据的应用程序中没有停机时间。重新索引API还支持各种conf参数,以使索引过程更快。


使用update_by_query方法进行更新操作时,不会出现任何停机时间。 - Val

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