reindex api
reindex 介绍
Reindx API :支持把文档(query 指定文档,不指定则是全部)从一或多个索引(本地或远程)source导入到另外一个索引 dest
- 修改索引的主分片数,修改字段类型,集群内数据迁移/跨集群数据迁移可使用 reindex
reindex api 的注意事项:
- _source必须是 enabled 对于 source index 的所有文档
- reindex 其 dest 无法拷贝 source 索引的settings和mappings,需要自己创建dest 索引再跑reindex
- reindex功能的底层实现原理是通过scroll方式实现的
reindex 支持参数
1.source
- index:指定源数据索引库,支持[]指定多个索引库
- slice:并行化执行reindex操作,自动并行化需要请求后 _reindex?slices=5 增加 slices
- max_docs:reindex 文档的最大数量
- remote:数据源是远程es集群
跨集群 reindex
1. 修改 elasticsearch.yml 增加白名单 并且重启节点:
reindex.remote.whitelist: "otherhost:9200, another:9200, 127.0.10.*:9200, localhost:*"
支持ip,端口号,通配符
2. _reindex 操作
POST _reindex
{
"source": {
"remote": {
"host": "http://otherhost:9200",
"username": "user", # 没有登录验证可不填
"password": "pass"
},
"index": "source",
"query": { # 匹配 source 中指定查询语句的文档导出
"match": {
"test": "data"
}
}
},
"dest": { # 导入到 dest 索引
"index": "dest"
}
}
- query:匹配 source 中指定查询语句的文档导出
- sort:支持 source 的文档排序导出,配合 size
- _source:支持 source 的文档只导出指定字段
2.dest
- op_type:默认不生效
"op_type": "create" # 文档若已经存在会导致版本冲突, _reindex 只会创建不存在的文档
# Reindx API,version Type Internal
POST _reindex
{
"source": {
"index": "blogs"
},
"dest": {
"index": "blogs_fix",
"op_type": "create"
}
}
- version_type:默认不生效,等同 internal,设置 external 根据外部版本判断,此时执行会把source的version覆盖到dest的version
internal 忽略版本 source 的文档直接覆盖 dest 的文档
external 根据 source 的版本和 dest 的版本判断是否覆盖 dest 的文档,需要source的版本大于dest相同文档的版本才能覆盖,新文档的version为两个源的最高版本,多用于二次导入,增加遗漏的文档
external_gte 大于等于
external_gt 大于
- routing:可更改导入文档的路由分片信息,值:keep 保留原文档的路由信息,discard 丢弃原文档的路由信息默认_id路由分片,= 指定新的路由信息
POST _reindex
{
"source": {
"index": "source",
"query": {
"match": {
"company": "cat"
}
}
},
"dest": {
"index": "dest",
"routing": "=cat" # 所有路由指定为cat
}
}
- pipeline:Reindex can also use the Ingest node feature by specifying a pipeline, dest 可指定 pipeline 使用节点预处理功能
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "dest",
"pipeline": "some_ingest_pipeline"
}
}
3.conflicts:默认,版本冲突会中断 _reindex 进程,指定 proceed 则版本冲突不会中断,会返回冲突数量
POST _reindex
{
"conflicts": "proceed", # 加上则不会冲突中断
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter",
"op_type": "create"
}
}
4.size:限制从source导出的符合条件的文档数量
5.script:支持脚本操作,对导出的文档做二次加工再导入
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter",
"version_type": "external"
},
# This example bumps the version of the source document
"script": {
"source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",
"lang": "painless"
}
}
# 支持将 source 的flag字段映射到 dest 的tag
POST _reindex
{
"source": {
"index": "test"
},
"dest": {
"index": "test2"
},
"script": {
"source": "ctx._source.tag = ctx._source.remove(\"flag\")" # 令tag=flag,删除flag字段
}
}
reindex 异步操作
reindex api 支持异步操作,执行只返回 task id
POST _reindex?wait_for_completion=false
查看task
GET _tasks?detailed=true&actions=*reindex
查看指定task
GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619
取消task
POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel