Elasticsearch 5.x Document Reindex
Reindex会将一个索引的数据复制到另一个已存在的索引,但是并不会复制原索引的mapping(映射)、shard(分片)、replicas(副本)等配置信息。
一、reindex的常用操作
1、reindex基础实现
_reindex会将一个索引的快照数据copy到另一个索引,默认情况下存在相同的_id会进行覆盖(一般不会发生,除非是将两个索引的数据copy到一个索引中),可以使用以下命令将索引快照进行copy:
POST _reindex
{
"source": {
"index": "my_index_name"
},
"dest": {
"index": "my_index_name_new"
}
}
2、version_type(冲突的解决)
version_type属性默认值为internal,即当发生冲突后会覆盖之前的document,而当设置为external则会新生成一个另外的document,设置方式如下:
POST _reindex
{
"source": {
"index": "my_index_name"
},
"dest": {
"index": "my_index_name_new",
"version_type": "external"
}
}
3、op_type和conflicts
将op_type设置为create时,只会对发生不同的document进行reindex,(若定时机制的reindex则可以使用该方式只对最新的不存在的document进行reindex)。并且可以将conflicts属性设置为proceed,将冲突进行类似于continue的操作,设置方式如下:
POST _reindex
{
"conflicts": "proceed",
"source": {
"index": "my_index_name"
},
"dest": {
"index": "my_index_name_new",
"op_type": "create"
}
}
4、query的reindex
对满足query条件的数据进行reindex操作,查询方式如下:
POST _reindex
{
"source": {
"index": "my_index_name",
"type": "my_type_name",
"query": { // query的条件
"term": {
"user": "kimchy"
}
}
},
"dest": {
"index": "my_index_name_new"
}
}
5、多Index、Type数据的reindex
可以将多个索引或类型的数据reindex到一个新的索引中,当然还可以使用query查询条件只对其中满足条件的部分数据进行reindx,若不设置冲突则还是默认会进行覆盖,只是不能保证相同ID的数据那个索引的数据会被先索引而被覆盖,设置方式如下:
POST _reindex
{
"source": {
"index": ["index_name_1", "index_name_1"],
"type": ["type_name_1", "type_name_2"],
"query": { // query的条件
"term": {
"user": "kimchy"
}
}
},
"dest": {
"index": "all_together_index_name"
}
}
6、size、sort(reindex的条数和排序控制)
POST _reindex
{
"size": 10000, // 值reindex按照sort排序后的size条数据
"source": {
"index": "my_index_name",
"sort": { "date": "desc" }
},
"dest": {
"index": "my_index_name_new"
}
}
7、source条件的reindex
满足_source中包含数组field(字段)的数据才会被reindex,设置方式如下:
POST _reindex
{
"source": {
"index": "my_index_name",
"_source": ["field_name_1", "field_name_2"]
},
"dest": {
"index": "my_index_name_new"
}
}
8、script类型的reindex
与_update_by_query相同的是reindex也可以使用script,但是不同的是reindex可以修改源索引的数据信息,比如:
POST _reindex
{
"source": {
"index": "my_index_name"
},
"dest": {
"index": "my_index_name_new",
"version_type": "external"
},
"script": {
"source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",
"lang": "painless"
}
}
9、修改字段名称
以下会在copy后将新索引中的flag字段名称修改为tag:
POST _reindex
{
"source": {
"index": "test"
},
"dest": {
"index": "test2"
},
"script": {
"source": "ctx._source.tag = ctx._source.remove(\"flag\")"
}
}
文章来源:https://blog.csdn.net/it_lihongmin/article/details/78601697
来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html
推荐阅读