上一篇说了对ES的index迁移的方式,这篇来讲一下具体怎么迁移
既然要迁移,那就得考量对已有业务的影响,为了避免对已有业务的影响,这里提供介绍一种方式,ES别名 _aliases
别名说起来很简单,就像一个代号,比如你叫小明(是不是好久没接触过这个名字了~),在你的公司,你的代号就叫开发,我一喊开发,你就知道喊你,某一天,你转岗了,干了测试,来了新的人接替你之前的岗位,于是乎,大家又喊你小明,而新来的接替你工作的人,就接替了“开发”这个代号,我一喊开发,他就知道是在叫他,如果我是领导,我并不关心谁是真的开发,我只需要找到开发而已,别名也是这个道理
ES的别名 _aliases ,就想上面的道理一样,我们可以先给老的索引库 old_index设置一个别名,比如别名是 index_query,不管是java程序还是python还是其他程序,只需要用这个别名 index_query 去查就行了,等我们把老索引库 old_index的数据导入到了新索引库 new_index中,我们再把老索引库的别名移动到新索引库上,不就行了么,不用去改程序的配置文件啊或者代码的,是不是很方便
当然,细心的人可能会想到一个问题,在移动别名的过程中,会不会出现查的库不对的情况,哈哈,这个问题ES当然也想到了,我们可以同时移除和新增同一个别名,这个操作在ES里是原子性的,不会出现那一瞬间的切换问题,大可放心~
啥,不大明白咋用?行,我们来上代码,上语句!
给ES索引库加别名:
// 给某个索引库加别名
POST /_aliases
{
"actions":[
{"add":{"index":"old_index","alias":"index_query"}}
]
}
// 给某个索引库移除别名
POST /_aliases
{
"actions":[
{"remove":{"index":"old_index","alias":"index_query"}}
]
}
// 给某个索引库移除别名的同时给某个索引库加别名
POST /_aliases
{
"actions":[
{"remove":{"index":"old_index","alias":"index_query"}},
{"add":{"index":"new_index","alias":"index_query"}}
]
}
代码(以JAVA为例):
SearchSourceBuilder builder = new SearchSourceBuilder();
SearchRequest request = new SearchRequest("index_query");
builder.query(QueryBuilders.termQuery("field1", "JAVA"));
builder.size(5000);
request.source(builder);
SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
也就是说,你一直查这个别名就完事了,不用管换库什么的,只要别名是这个别名就行! 就相当于一个代理