可以用来处理大分片和数据迁移,以及索引规整
- Reindex API的使用
- 使用前提
- 主要功能
- 使用举例
- 本集群复制
- 将源索引的部分字段进行复制到目标索引
- 使用脚本脚本修改文档和文档元数据
- 重新路由目标索引文档
- 跨集群复制索引
- 修改目标字段名称
- 分片
- 手动切片
- 自动切片
- 批量reindex
- reindex任务管理
- 查看任务API
- 取消任务API
- 动态限流
- 问题总结
- 源码分析
- 源索引中的所有文档启用
_source
。 - Reindex 不会尝试设置目标索引。 它不会复制源索引的设置。 您应该在运行
_reindex
操作之前设置目标索引,包括设置映射、分片计数、副本等。 - Reindex API 不努力处理 ID 冲突,因此只保留最后写入的文档,但顺序通常不可预测,因此依赖此行为不是一个好主意。 相反,请使用脚本确保 ID 是唯一的。
简单功能:
- 将源索引的文档复制到目标索引
复杂功能:
-
将源索引的部分字段进行复制到目标索引
-
脚本修改文档和文档元数据
-
跨集群复制索引
-
Reindex API 同样支持
refresh
,wait_for_completion
,wait_for_active_shards
,timeout
,scroll
, andrequests_per_second
.
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
必要参数:
-
source
源索引的部分
- index:索引名称,可以是一个列表,取值方式[“indexName1”,“indexName1”]
-
dest
目标索引部分
- index:索引名称
可选参数:
-
version_type
在dest参数下,取值如下
- internal:将数据盲目的从源索引写入目标索引,对于相同的type和id,会进行数据覆盖
- external:代表以源索引中的数据为主,出现冲突是保留源索引的数据。
-
conflicts
默认情况下,版本冲突会中止
_reindex
进程。将这个参数设置成proceed
可以继续进程并统计出现版本冲突的次数 -
op_type
在dest参数中取值:
- create:代表只向目标索引插入源索引中与目标索引不同的文档,相同的文档会报版本冲突。
-
query
在source参数下,就是一个查询的语句,对源索引的数据进行删选
-
size
代表从源索引中取出的数据量,一般与
sort
参数结合使用。 -
size
与上面的
size
不同,这是在source参数下的,代表一批次的数据量,默认值1000。 -
sort
代表对源索引中的数据进行排序,例如取值
{ "date": "desc" }
使用date字段进行desc排序,一般与size
参数结合使用。
在源索引中增加_source
参数可以进行字段的选择
POST _reindex
{
"source": {
"index": "twitter",
"_source": ["user", "_doc"]
},
"dest": {
"index": "new_twitter"
}
}
使用脚本脚本修改文档和文档元数据
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter",
"version_type": "external"
},
"script": {
"source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",
"lang": "painless"
}
}
5.X的版本中脚本中使用的是inline参数名
"inline": "if (ctx._source.applyDate == '') {ctx._source.applyDate=null} if (ctx._source.departDate == '') {ctx._source.departDate=null} if (ctx._source.destinatDate == '') {ctx._source.destinatDate=null}",
ctx可以设置的属性:
-
op
可以通过op来进行修改对目标索引的操作
- noop:忽略文档,不对这个索引进行操作
- delete:删除该文档,从目标索引中将这个文档删除
-
_id
可以查询满足条件的id,并修改id写入目标索引
-
_type
可以查询满足条件的type,并修改id写入目标索引
-
_index
可以使用通过不等式进行匹配
"script": { "lang": "painless", "source": "ctx._index = 'metricbeat-' + (ctx._index.substring('metricbeat-'.length(), ctx._index.length())) + '-1'" }
-
_version
将 _version 设置为 null 或从 ctx 映射中清除它就像不在索引请求中发送版本一样; 无论目标上的版本或您在 _reindex 请求中使用的版本类型如何,它都会导致目标索引中的文档被覆盖。
-
_routing
默认情况下,如果 _reindex 看到带有路由的文档,则除非脚本更改路由,否则将保留路由。
keep
:默认值,保留源索引文档上的路由discard
:取消路由=
:修改文档的路由为=之后的值,写入目标索引
POST _reindex
{
"source": {
"index": "source",
"size": 100
},
"dest": {
"index": "dest",
"routing": "=cat"
}
}
跨集群复制索引
这是是将A集群中的a1索引复制到B集群的b1索引。那么源集群就是A集群,源索引就是a1,目标集群就是B,目标索引就是b1。因为源集群会向目标集群发送写请求。所以要满足以下前提:
- 在B集群上的
elasticsearch.yaml
中需要配置reindex.remote.whitelist
属性,值为集群A的HTTP访问地址。 - 跨集群一个reindex任务只支持一个切片
reindex.remote.whitelist: "otherhost:9200, another:9200, 127.0.10.*:9200, localhost:*"
在B集群(目标集群)执行reindex命令
POST _reindex
{
"source": {
"remote": {
"host": "http:// ${source_cluster_ip}:${httpPort}",
"socket_timeout": "60s",
"connect_timeout": "60s"
},
"index": "a1",
},
"dest": {
"index": "b1"
}
}
参数说明
host
参数中配置源集群的任意访问地址。
socket_timeout
与connect_timeout
的默认值是30s。
将源索引flag字段的内容写入目标索引的tag字段中。
POST _reindex
{
"source": {
"index": "test"
},
"dest": {
"index": "test2"
},
"script": {
"source": "ctx._source.tag = ctx._source.remove(
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?