索引重建II - reindex

query

如果只想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操作,它的性能更高。

Removing fields

reindex时,能只筛选特定的字段,这样可以节省磁盘空间:

POST /_reindex
{
  "source": {
    "index": "reviews",
    "_source": ["content","create_at","rating"]
  },
  "dest": {
    "index": "reviews_new"
  }
}

重命名field

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操作对集群性能带来影响。