1.前言
在es里面index aliases
就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:
(1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上
(2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引
(3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)
es里面操作索引别名的有两个api命令:
_alias 执行单个别名操作
_aliases 原子的执行多个别名操作
2. 如何使用?
假设我们有两个索引分别是my_index_v1
和my_index_v2
现在想通过索引别名来实现无缝切换,他们对外的索引别名叫my_index
。
-
首先我们先创建第一个
old index
并给你添加aliases
PUT /my_index_v1 //构建索引 PUT /my_index_v1/_alias/my_index //给索引添加别名
-
创建完成之后,我们可以查询一下他们的关系
GET /*/_alias/my_index //查某个别名映射的所有index GET /my_index_v1/_alias/* //查询某个index拥有的别名
返回结果如下:
{ "my_index_v1" : { "aliases" : { "my_index" : { } } } }
-
现在我们构建
new index
PUT /my_index_v2 //构建索引
新索引构建完毕之后,我们就可以执行切换操作命令了:
POST /_aliases { "actions": [ { "remove": { "index": "my_index_v1", "alias": "my_index" }}, { "add": { "index": "my_index_v2", "alias": "my_index" }} ] }
上面的操作是顺序的执行的,先移除old index的别名,然后给new index 添加新的别名,这样以来
索引就透明的别切换了,用户不会感觉任何变化,而且也不需要停机操作。
3. java api里面如何操作:
(1)添加别名
client.admin().indices().prepareAliases().addAlias("my_index_v1","my_index");
(2)移除别名
client.admin().indices().prepareAliases().removeAlias("my_index_v1","my_index");
(3)删除一个别名后再添加一个
client.admin().indices().prepareAliases().removeAlias("my_index_v1","my_index")
.addAlias("my_index_v2","my_index").execute().actionGet();
当别名添加完毕后,我们在删除,搜索,更新都可以直接使用:
SearchRequestBuilder search=client.prepareSearch("my_index");
有一点需要注意使用别名后,type类型的值不需要在填写,如果你填写了es是会抛异常的,因为它认为你这别名是一个新的索引,所以我们只写index name即可,es服务端知道它的类型。