ElasticSearch重建索引
基于scroll+bulk+索引别名实现零停机重建索引
一个field的设置后是不能被修改的,如果要修改,那么需要重新按新的mapping,建立一个index
实例操作
假如现在我要将createTime改为date类型,现在是字符串
直接修改是不行的,因为此时createTime字段已经建立,又不能直接删除index重建
不停机修改方式:
1.对索引建立别名
PUT /order_index/_alias/bm_order_index/
java代码里改为对别名的bm_order_index继续进行操作
java api里面操作方式:
(1)添加别名
client.admin().indices().prepareAliases().addAlias("order_index","bm_order_index");
(2)移除别名
(3)删除一个别名后再添加一个
client.admin().indices().prepareAliases().removeAlias("order_index","bm_order_index").addAlias("order_index_new","bm_order_index").execute().actionGet();
当别名添加完毕后,我们在删除,搜索,更新都可以直接使用:
SearchRequestBuilder search=client.prepareSearch("my_index");
需要注意使用别名后,type类型的值不需要在填写,如果你填写了es是会抛异常的,因为它认为你这别名是一个新的索引,所以我们只写index name即可,es服务端知道它的类型。
2.新建新的索引order_index_new
3.使用scroll将数据一批批的查询出来
POST /order_index/order_type/_search?scroll=1m
{
"query": {
"match_all": {}
},
"sort": [
"_doc"
],
"size": 1
}
4.使用bulk将查询出来的数据批量导入新索引
POST /_bulk
{ "index": { "_index": "order_index_new", "_type": "order_type", "_id": "2" }}
{ .... }
5.将bm_order_index 的alias切换到order_index_new上去
POST /_aliases
{
"actions": [
{ "remove": { "index": "order_index", "alias": "bm_order_index" }},
{ "add": { "index": "order_index_new", "alias": "bm_order_index" }}
]
}
这样就完成了
java api操作: