elasticsearch reindex api

本文详细介绍了Elasticsearch的Reindex API,包括如何将文档从源索引迁移到目标索引,支持的参数如source、dest、conflicts、size等,并讨论了异步操作和其底层实现原理。注意_reindex API不复制source索引的settings和mappings,需手动创建dest索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值