Elasticsearch索引的基本操作(5)-别名设置

1、别名

Elasticsearch中的别名,可以分为索引别名、过滤器别名、路由别名等,不同的别名适用于不同的应用场景:

  • 索引别名就是给一个或几个索引重新定义一个名字,操作索引别名时会转化为对真实索引的操作,定义索引别名时不可以与真实的索引同名;
  • 过滤器别名提供了一种创建同一索引的不同“视图”的简便方法,可以使用Query DSL定义过滤器,并使用此别名将其应用于所有“搜索”,“计数”,“按查询删除”和“更多此类操作”;
  • 路由别名,将路由字段绑定到对应的别名,通过该别名操作时,会执行默认的路由规则,也可以理解为索引的另外一种“视图”;

1.1、索引别名

索引别名,可以应用于以下场景:

  • 将正常运行集群中的索引迁移到另外一个索引,无须停机操作;
  • 将多个索引进行分组,以便于更好的管理;
  • 给索引创建类似于视图的子集;

1.1.1、增加别名

给单个索引增加别名

为索引new_index定义别名new_index_alias,操作如下:

GET /new_index/_alias/new_index_alias

或执行如下操作:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index", "alias" : "new_index_alias" } }
]
}

给多个索引增加相同的别名

给索引new_index和new_index_2增加相同的别名new_index,操作如下:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "add" : { "index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

也可以按以下的方式操作:

POST /_aliases
{
"actions": [
{
"add": {
"indices": [ "new_index","new_index_2" ],
"alias": "new_index_alias"
}
}
]
}

​​​​​​​​​​​​​​给多个索引增加不同的别名

给索引new_index和new_index_2分别增加相同的别名new_index_alias和new_index_alias_2,操作如下:

POST /_aliases
{
"actions" : [
{ "add":{ "index" : "new_index", "alias" : "new_index_alias" } },
{ "add":{ "index" : "new_index_2", "alias" : "new_index_alias_2" } }
]
}

根据索引通配符创建别名

创建所有以new_index开头的别名new_index_alias,操作如下:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index*", "alias" : "new_index_alias" } }
]
}

​​​​​​​使用指向多个索引的别名执行索引操作

指向多个索引的别名,用于执行查询不需要做额外的设置,如果需要用于执行索引操作,则需要在被指向的多个索引中指定用于执行索引操作的索引,否则报错误。

如别名new_index_alias是索引new_index和new_index_2的别名,此时没有在new_index和new_index_2中指定哪个用于执行索引操作,则执行以下操作时:

POST /new_index_write/_doc
{
"title": "Alias for multi index write test",
"name": "Alias"
}

会报如下错误:

{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "no write index is defined for alias [new_index_write]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
}
],
...
"status": 400
}

这种情况需要通过设置is_write_index属性来指定哪个索引可用于执行索引操作,重新建立别名,操作如下:

POST /_aliases
{
"actions": [
{

"add": {
"index": "new_index",
"alias": "new_index_write",
"is_write_index": true
}
},
{
"add": {
"index": "new_index_2",
"alias": "new_index_write",
"is_write_index": false
}
}
]
}

设置好后再执行索引上面的索引操作,就不会报错了。

​​​​​​​1.1.2、​​​​​​​删除别名

删除单个索引别名

删除索引new_index上的别名new_index_alias,操作如下:

DELETE /new_index/_alias/new_index_alias

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } }
]
}

​​​​​​​删除多个索引别名

同时删除索引new_index和new_index_2上的别名new_index_alias,操作如下:

#多个索引以英文逗号“,”分隔

DELETE /new_index,new_index_2/_alias/new_index_alias

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "remove":{"index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

同时删除索引new_index的多个别名,多个别名以英文逗号“,”分隔,操作如下:

#多个别名以英文逗号“,”分隔

DELETE /new_index/_alias/new_index_alias_1,new_index_alias_2

​​​​​​​1.1.3、重命名别名

别名的重命名,是通过同时执行remove和add操作来实现的,该操作中的两个动作是原子性的,不会存在别名被删除的瞬间产生没有指向任何索引的问题。

以下将指向new_index的别名new_index_alias重新指向new_index_2,操作如下:

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "add" : { "index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

1.1.4、索引别名查看

查看单个索引的别名

查看指定索引有哪些别名,如查看索引new_index有哪些别名,操作如下:

GET /new_index/_alias/*

返回如下:

{
"new_index" : {
"aliases" : {
"new_index_alias" : { },
"new_index_alias_1" : { }
}
}
}

返回显示索引new_index有new_index_alias和new_index_alias_1两个别名。

​​​​​​​查看多个索引的别名

在索引参数中,通过英文逗号“,”分隔多个索引的名称,操作如下:

GET /new_index,new_index_2/_alias/*

或者使用通配置符指定:

GET /new_index*/_alias/*

​​​​​​​确认别名是否存在

使用HEAD方法,可以检查别名是否存在。

检查指定别名是否属于某个索引,操作如下:

HEAD /new_index/_alias/new_index_route_alias

存在则返回“200 - OK”,不存在则返回“404 - Not Found”。

​​​​​​​1.2、过滤器别名

过滤器别名也是属于索引别名的一种,只是其包含了过滤条件,属于类似视图的别名。

索引new_index中有如下示例数据:

此处创建一个过滤器别名,通过该别名只会查看到name为”Feng”的数据,操作如下:

POST /_aliases
{

"actions": [
{
"add": {
"index": "new_index",
"alias": "new_index_feng_alias",
"filter": { "term": { "name": "feng" } }
}
}
]
}

此处为索引new_index定义了一个名为new_index_feng_alias的过滤器别名,过滤条件为name的值为”feng”,后续直接使用该别名执行查询时,即使不带任何条件,也只会过滤出name的值为”feng”的数据,验证操作如下:

GET /new_index_feng_alias/_search

​​​​​​​1.3、路由别名

用于给查询和索引操作的路由字段指定别名,可统一指定也可以分别指定,操作方式和过滤器别名一样,也可以理解为索引的另外一种视图。

​​​​​​​统一定义查询和索引操作的路由别名

以下定义了索引new_index的路由别名new_index_route_alias,使用字母“a”做为路由值,操作如下:

POST /_aliases
{
"actions" : [

{
"add" : {
"index" : "new_index",
"alias" : "new_index_route_alias",
"routing" : "a"
}
}
]
}

​​​​​​​分别给查询和索引操作定义不同的路由值

以下定义了索引new_index的路由别名new_index_route_alias_2,使用字母“a”做为索引路由值,使用字母“a,b”做为查询路由,操作如下:

POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "new_index",
"alias" : "new_index_route_alias_2",
"index_routing":"a",
"search_routing" : "a,b"
}
}
]
}

注:查询路由可以包含多个值,以英文逗号“,”做为分隔,但是索引路由只能够是单一值。

​​​​​​​使用路由别名执行查询且指定了路由字段

有时在使用路由别名执行查询查询操作时,又同时通过参数的方式指定路由字段,如下查询示例:

GET /new_index_route_alias/_search?q=name:feng&routing=b,c

这种情况下,路由值就会取当前参数指定的值由与路由别名中定义的路由值的交集,当前示例就会取“b”做为查询路由值。


分享到:


相關文章: