Elasticsearch别名
ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处。别名是一个非常实用的功能,为我们使用索引提供了极大的灵活性,许多ES的API都支持用别名来代替真实索引名。通过索引我们可以方便的进行以下操作:
- 实现正在运行的集群上的一个索引到另一个索引之间的无缝切换。试想一下这种场景,由于业务变换,我们需要将业务数据有索引1变换到新的索引2上,如果没有别名,我们必须修改和中断业务系统,但是有了别名,只需要修改别名,另起指向新的索引2即可,这样的操作可以在用户无任何感知的情况下完成。
- 使数据检索等操作更加方便。假如有两个月的日志数据,分别存放在index_202008和index_202009两个索引中,没有使用别名进行检索时,我们需要同时写上两个索引名称进行检索,使用索引后,我们可以令别名同时指向这两个索引,检索时只需要使用这个别名就可以同时在两个索引中尽心检索。
- 为一个索引中的部分数据创建别名,例如,一个索引中存放了一整年的数据,现在新增一个业务场景,更多的是对其中某一个月的数据进行检索,这时,我们可以在创建别名时,通过设置过滤条件filter,可以单独令别名指向一个月的数据,使得检索更加高效。
通过上面的场景我们可以看出,ES中别名可以指向一个索引,也可以同时指向多个索引,甚至可以通过配合过滤器filter指向索引中部分数据。别名可以再创建索引时添加,也可以在索引创建后进行添加,ES中提供丰富的API对别名进行管理。接下来,我们捋一捋ES中对别名的操作。
1 创建别名
创建别名有很多种方法,可以创建索引同时创建别名,也可以在创建索引后创建,既可以让别名指向多个索引,也可以让别名指向一个索引的部分数据,甚至指向一个字段。我们来一一例举这是如何操作的。
(1)创建索引同时创建别名
创建一个名为users用户索引,索引中记录了用户出生年,现在,我们在创建索引的同时,创建两个别名,一个别名指向整个users索引,并通过filter进行过滤,使别名只指向2000年出生的用户。
(2)创建索引后创建别名
直接通过API路由传递别名来创建,这种方法有一下几种请求方式,注意,这种方式要求索引必须存在。
PUT /<index>/_alias/<alias>
POST /<index>/_alias/<alias>
PUT /<index>/_aliases/<alias>
POST /<index>/_aliases/<alias>
可以通过请求体来对别名进行设置,例如创建一个名为2020的别名,指向users索引中birth-year字段值为2020的文档。
(3)创建字段别名
索引可以拥有别名,字段也可以,在创建索引时,我们可以为字段设置一个别名。例如,为username字段设置一个别名name。
2 修改+删除别名
之所在现在要将修改别名和删除出别名放在一起来说,是因为下面的这个API功能太多,既能够添加别名,也能修改别名,还能删除别名。通过例子来说明,例如,为users索引添加一个名为alias1的笔名,可以这么操作:
这个API形式上很好理解,就是想aliases
路由发送一个POST请求,别名的信息都是在请求体中进行配置,actions
表示需要进行的操作,里面每一个子项都表示一个动作,这个动作可以为add
表示添加别名的操作,remove
表示删除别名的操作。index
表示针对哪一个索引上创建别名,alias
后面跟着的就是新建或者需要删除的别名的名称。下面通过一些例子说明如何使用这一API。
(1)为同一索引创建多个别名
(2)删除一个别名
(3)重命名一个别名
ES中别为提供直接进行重命名操作的关键字,而是先执行remove,然后执行add,这一操作是原子操作,所以无需担心别名删除未创建的短暂中空期,这相当于为为原来别名创建了一个新的引用,删除旧的应用,实际还是同一个别名,例如将名为alias1的别名重命名为alias2,可以这么操作:
(4)创建一个别名指向多个索引
例如创建一个名为myusers的别名同时指向索引users1和users2:
也可以通过通配符来实现这一操作:
(5)创建有过滤条件的别名
(6)创建可写入别名
如果一个别名单独指向一个索引,那么使用别名进行写入操作是不会有问题的,但是,一个别名指向多个索引索引时,是不能进行写入操作,因为ES不知道将文档写入到哪一个索引。这一问题可以在创建别名时将某一个索引设置为可写来解决,注意,只能设置一个。
3 查看别名信息
(1)查看别名是否存在
使用HEAD请求方式+别名可以查看别名是否存在:
HEAD /_alias/<alias>
HEAD /<index>/_alias/<alias>
可使用HEAD方式查看是否存在,如果查看整个集群是否存在某个别名,可以这样操作:
如果存在,则返回200状态码,如果不存在,返回404状态码:
如果是查看某个索引是否有某个别名,可以这么操作:
(2)查看别名信息
查看别名信息API如下所示:
GET /_cat/aliases/<alias>
GET /_cat/aliases
前者查看指定别名,后者查看集群中所有别名。