gpt4 book ai didi

ElasticSearch:从存在的所有文档中删除字段(使用 Painless?)

转载 作者:行者123 更新时间:2023-12-02 22:21:51 27 4
gpt4 key购买 nike

情况 : 我有一个严格映射的索引,我想从中删除一个不再使用的旧字段。因此,我使用不包含该字段的映射创建了一个新索引,并尝试将数据重新索引到新索引中。

问题 :当我重新编制索引时,出现错误,因为我试图将数据索引到映射中不可用的字段中。
所以为了解决这个问题,我想先从原始索引中的所有文档中删除该字段,然后才能重新索引。

PUT old_index/_doc/1
{
"field_to_delete" : 5
}
PUT old_index/_doc/2
{
"field_to_delete" : null
}
POST _reindex
{
"source": {
"index": "old_index"
},
"dest": {
"index": "new_index"
}
}
"reason": "mapping set to strict, dynamic introduction of [field_to_delete] within [new_index] is not allowed"

1.我发现的一些地方建议这样做:
POST old_index/_doc/_update_by_query
{
"script": "ctx._source.remove('field_to_delete')",
"query": {
"bool": {
"must": [
{
"exists": {
"field": "field_to_delete"
}
}
]
}
}
}


但是,这与具有显式值 null 的文档不匹配。 ,因此在此更新后重新索引仍然失败。

2. 其他人(比如他们官方论坛上的 Elastic 团队成员)建议这样做:
POST old_index/_doc/_update_by_query
{
"script": {
"source": """
if (ctx._source.field_to_delete != null) {
ctx._source.remove("field_to_delete");
} else {
ctx.op="noop";
}
"""
}
},
"query": {
"match_all": {}
}
}

然而,这有同样的问题 - 它不会删除具有显式值 null 的第二个文档。 .

3.最后我只能这样做:
POST old_index/_doc/_update_by_query
{
"script": {
"source": "ctx._source.remove("field_to_delete");"}
},
"query": {
"match_all": {}
}
}

但这将更新所有文档,对于大型索引可能意味着部署期间的额外停机时间。

最佳答案

最终我找到了正确的方法,所以我将它分享为一般知识:

POST old_index/_doc/_update_by_query
{
"script": {
"source": """
if (ctx._source.containsKey("field_to_delete")) {
ctx._source.remove("field_to_delete");
} else {
ctx.op="noop";
}
"""
},
"query": {
"match_all": {}
}
}

关于ElasticSearch:从存在的所有文档中删除字段(使用 Painless?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56649273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com