《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(5) https://developer.aliyun.com/article/1230243
基于多源重新索引
source的index属性值可以是一个 list;这样可以允许复制多个源的文档到目的数据流或索引,但是需要注意多个源的文档中字段的类型必须一致。
例如复制my-index-000001和my-index-000002索引的文档:
POST _reindex { "source": { "index": ["my-index-000001", "my-index-000002"] }, "dest": { "index": "my-new-index-000002" } }
选择字段重新索引
只重新索引每个文档筛选的字段;
例如,以下请求仅重新索引每个文档的user.id和 _doc字段:
POST _reindex { "source": { "index": "my-index-000001", "_source": ["user.id", "_doc"] }, "dest": { "index": "my-new-index-000001" } }
通过重新索引修改文档中字段名字
_reindex可用于复制源索引文档,在写入目的索引之前,重命名字段;假设my-index-000001索引有以下文档:
POST my-index-000001/_doc/1?refresh { "text": "words words", "flag": "foo" }
但是你想把字段名flag替换成tag,处理手段如下(当然也可以用 ingest pipeline):
POST _reindex { "source": { "index": "my-index-000001" }, "dest": { "index": "my-new-index-000001" }, "script": { "source": "ctx._source.tag = ctx._source.remove(\"flag\")" } }
现在获取新索引文档:
GET my-new-index-000001/_doc/1
返回值如下:
{ "found": true, "_id": "1", "_index": "my-new-index-000001", "_type": "_doc", "_version": 1, "_seq_no": 44, "_primary_term": 1, "_source": { "text": "words words", "tag": "foo" } }
重新索引每日索引
_reindex结合 Painless 脚本来重新索引每日索引,将新模板应用于现有文档。假设你有如下索引并包含下列文档:
PUT metricbeat-2021.05.10/_doc/1?refresh {"system.cpu.idle.pct": 0.908} PUT metricbeat-2021.05.11/_doc/1?refresh {"system.cpu.idle.pct": 0.105}
通配metricbeat-* 索引的新模板,已经加载到 Elasticsearch 中,但是该模板只会对新建的索引生效。Painless 可用于重新索引现有文档,并应用新模板。下面的脚本从索引名中提取日期,并创建一个新索引,新索引名添加 -1。metricbeat-2021.05.10所有的数据将会被重建到metricbeat-2021.05.10-1。
POST _reindex { "source": { "index": "metricbeat-*" }, "dest": { "index": "metricbeat" }, "script": { "lang": "painless", "source": "ctx._index = 'metricbeat-' + (ctx._index.substring('metricbeat-'.length(), ctx._index.length())) + '-1'" } }
之前metricbeat索引的数据,都能从新的索引从获取到:
GET metricbeat-2021.05.10-1/_doc/1 GET metricbeat-2021.05.11-1/_doc/1
提取源的随机子集
_reindex 可用于提取源的随机子集以进行测试:
POST _reindex { "max_docs": 10, "source": { "index": "my-index-000001", "query": { "function_score" : { "random_score" : {}, "min_score" : 0.9 #备注1 } } }, "dest": { "index": "my-new-index-000001" } }
可能需要根据从源中提取数据的相对数量,来调整min_score的值
重新索引时修改文档
像 _update_by_query一样,_reindex支持使用 script 修改文档;不同的是,_reindex中使用脚本可以修改文档的元数据。
此示例增加了源文档的版本:
POST _reindex { "source": { "index": "my-index-000001" }, "dest": { "index": "my-new-index-000001", "version_type": "external" }, "script": { "source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}", "lang": "painless" } }
与 _update_by_query一样,你可以设置ctx.op更改在dest上执行的操作:
noop
如果决定不必在目标中为文档重新索引,则需要在脚本中设置 ctx.op="noop"。响应主体中的noop计数器将报告不做任何的操作。
delete
如果必须从目标(dest)中删除文档,则需要在脚本中设置 ctx.op=“delete”。删除将在响应正文中的已删除计数器中报告 。
设置ctx.op为其他任何值都将返回错误,就像设置中的其他任何字段一样ctx。
同时还可以更改一些索引元信息,但是谨慎操作:
l _id
l _index
l _version
l _routing
如果将 _version设置为null或将其从ctx映射中清除,就像不在索引请求中发送版本一样; 则无论目标上的版本或 _reindex请求中使用的版本类型如何,都会导致目标中的文档被覆盖。
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(7) https://developer.aliyun.com/article/1230240