如果只想reindex部分数据,可以使用查询语句限制,例如:
POST /_reindex
{
"source": {
"index": "reviews",
"query": {
"match_all": {}
}
},
"dest": {
"index": "reviews_new"
}
}
上面的效果其实还是把所有数据导入到新的index中。
在query中执行筛选能过滤出一部分数据,例如只想导入rating
大于4.0的数据:
POST /_reindex
{
"source": {
"index": "reviews",
"query": {
"range": {
"rating": {
"gte": 4.0
}
}
}
},
"dest": {
"index": "reviews_new"
}
}
上面的功能也可以使用script
实现:
POST /_reindex
{
"source": {
"index": "reviews"
},
"dest": {
"index": "reviews_new"
},
"script": {
"source": """
if (ctx._source.rating < 4.0) {
ctx.op = "noop";
}
"""
}
}
但是更建议使用query
操作,它的性能更高。
在reindex
时,能只筛选特定的字段,这样可以节省磁盘空间:
POST /_reindex
{
"source": {
"index": "reviews",
"_source": ["content","create_at","rating"]
},
"dest": {
"index": "reviews_new"
}
}
在reindex
时,可以将某个字段重命名,例如将content
改为comment
:
POST /_reindex
{
"source": {
"index": "reviews"
},
"dest": {
"index": "reviews_new"
},
"script": {
"source": """
ctx._source.comment = ctx._source.remove("content");
"""
}
}
**关于reindex
,还有一些其他要注意的地方:**
1. 在reindex
时可能会遇到版本冲突,此时该操作被取消;
2. 目标索引不一定完全是空;
3. 在reindex
前,会对源索引先创建一个快照;
4. 在生产环境建议配置throttling
,防止reindex操作对集群性能带来影响。