gpt4 book ai didi

elasticsearch - 当拥有大量数据时,将 type_mapping 从 long 更改为 string 的最快方法是什么?

转载 作者:行者123 更新时间:2023-12-03 00:42:23 26 4
gpt4 key购买 nike

我通过将数据移动到新索引来尝试使用别名索引,但我发现它花了太长时间,按照本指南 https://www.elastic.co/blog/changing-mapping-with-zero-downtime .

此外,我有大约 7500 万个文档,而且每一秒都在增长。

我尝试使用 elasticdump 将数据从旧索引移动到新索引,但速度非常慢。

有什么最快的方法可以更改类型映射吗?

最佳答案

实现此目的的一种方法是创建另一个 string映射中的字段并修改现有 long一个带 copy_to到那个新领域。

curl -XPUT localhost:9200/your_index/_mapping/your_type -d '{
"your_type": {
"properties": {
"long_field": {
"type": "long",
"copy_to": "str_field" <---- copy_to new field
},
"str_field": { <---- new field
"type": "string",
"store": true <---- store it if you want to see it using fields=...
}
}
}
}'

所有新索引的文档都将获得新字段 str_field人口稠密。当然,您还可以修改索引过程以直接在发送给 ES 的源文档中填充该新字段。请注意,如果您不这样做, str_field只会被索引(所以它可以被搜索)但它不会出现在 _source 中.您仍然可以存储 str_field通过添加 "store": true对于该字段,然后您将能够在使用 &fields=str_field 查询时看到它的值

对于所有现有文档,该字段可以以不同方式填充 没有 必须重新索引所有内容(这会破坏目的,您只需创建一个新索引),但是通过巧妙地为该新字段设置批量重新索引过程,这是可以做到的。

另一个核心解决方案是使用 update-by-query plugin .

您仍然需要添加新的 str_field到您的映射,而不修改现有的映射:
curl -XPUT localhost:9200/your_index/_mapping/your_type -d '{
"your_type": {
"properties": {
"str_field": { <---- new field
"type": "string"
}
}
}
}'

然后使用该插件,您可以发出这样一个查询,该查询将填充新字段(如果您不再需要它,还可以选择从源中删除 long_field:
curl -XPOST 'localhost:9200/your_index/_update_by_query' -d '{
"query" : {
"match_all" : {}
},
"script" : "ctx._source.str_field = String.valueOf(ctx._source.long_field); ctx._source.remove(\"long_field\"); "
}'

对于第二个解决方案,您需要确保在 elasticsearch.yml 中启用脚本。并重启ES:
script.inline: on 
script.indexed: on

但是请注意,使用第二个解决方案时,除非您还调整索引过程以包含新的 str_field,否则您的新字段将不会被填充。您发送到 ES 的 JSON 文档中的字段。

关于elasticsearch - 当拥有大量数据时,将 type_mapping 从 long 更改为 string 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991968/

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