序言
Elasticsearch提供了很多开发与运维便利的特性,很多特性看起来微不足道,需要时感慨真是卧虎藏龙。

以下围绕Elasticsearch提供的别名特性展开,主要探讨几个方面:
 1.别名的应用类型
 2.别名的应用场景

es别名索引一对多 es索引别名的使用场景_es别名索引一对多


需求背景


早期基于Lucene自主开发搜索应用,定期重新生成索引,之后应用访问平滑的切换,需要做一大堆的辅助工作,后接触到Elasticsearch,提供了索引别名特性,很容易完成切换。

应用场景


Elasticsearch提供了两种别名机制:


1.索引别名

2.字段别名

索引别名


Elasticsearch索引本质上是个虚拟的空间,本后的实际数据存储查询都是由分片完成,索引访问索引本身也是通过索引代理实现,可以这样理解,默认索引别名就是索引名称本身。


索引别名,应用在索引访问层面。

1.应用索引重建切换


在应用系统中,索引需要定期维护,如索引重建,重建时为了不影响线上系统应用,一般会重新创建新的索引,待新索引数据重建完成,就需要无缝的替换掉原有索引,这个时候就需要引入索引别名


es别名索引一对多 es索引别名的使用场景_数据_02

2.应用索引外部隔离
互联网行业中,典型的如电商订单场景,有实时订单与历史订单;常规设计有实时订单索引与历史订单索引分开,实时索引存储最近未完成的订单数据,如最近30天内;历史索引则相当于全量的订单数据,相比实时会有一些延迟,历史的数量非常的庞大,一般也会拆分成很多个索引,访问历史索引数据可以通过别名来指定,绑定所有历史索引,而不用人工指定索引查询,这带来了很便利。

es别名索引一对多 es索引别名的使用场景_Elastic_03

3.应用索引内部隔离
索引创建多了,集群需要管理更多的元数据,消耗更多的管理节点资源,如果索引本身数量不是很大,可以将很多数据合并到一个索引中,对外采用多别名的方式隔离,每个别名仅限其中某些类型的数据访问。

es别名索引一对多 es索引别名的使用场景_es 切换别名_04

字段别名
字段别名,更容易理解,应用在字段访问层面。1.字段代理查询
在传统关系型数据库中,由于业务原因,早期设计数据表时,字段与业务的映射是基于某种场景需求,后期又增加了更多的数据字段,原来的字段命名与新的会有很多奇异,造成一些开发与设计困扰,在Elasticsearch中,一样有此问题,所以可以通过字段别名替代,消除这种歧义。2.别名字段更新

字段别名不能直接更新,只能更新别名指向的字段技术实现
Elasticsearch提供的别名API非常简单,相当容易理解。

索引别名1.索引别名创建,简单代理场景实现

#为索引myindex_001创建别名myindexPUT /myindex_001/_alias/myindex#原有索引访问方式GET myindex_001/_search#通过别名访问方式GET myindex/_search

2.索引别名创建,绑定多个索引场景实现

#为索引myindex_001~005 绑定相同别名 myindexPUT myindex_001/_alias/myindexPUT myindex_002/_alias/myindexPUT myindex_003/_alias/myindexPUT myindex_004/_alias/myindexPUT myindex_005/_alias/myindex#通过别名访问所有索引GET myindex/_search

es别名索引一对多 es索引别名的使用场景_es别名索引一对多_05

3.索引别名创建,限定索引内容查询场景实现

#创建索引myuser_001的别名userid_12,限定访问user_12的数据PUT /myuser_001/_alias/user_12{    "routing" : "12",    "filter" : {        "term" : {            "user_id" : 12        }    } }#通过别名访问所有索引GET user_12/_search


字段别名

1.字段别名创建,简单代理场景实现


#创建字段别名索引 mytrips_001PUT mytrips_001{  "mappings": {    "properties": {      "distance": {        "type": "long"      },      "route_length_miles": {        "type": "alias",        "path": "distance"      },      "transit_mode": {        "type": "keyword"      }    }  }}#填充数据POST mytrips_001/_doc{  "distance":200,  "transit_mode":"huoche"}#字段别名限制查询GET /mytrips_001/_search{  "query": {    "range" : {      "route_length_miles" : {        "gte" : 110      }    }  }}


注意事项

索引别名


索引别名确实相比过去自主实现切换确实代理了很多便利,但也不可以大规模混乱使用,使用时注意几点:


1.原有索引名称命名要规范有规律可循,创建别名绑定时,容易归类


2.索引别名可绑定多个索引,单个索引也可绑定多个索引别名,注意控制双向绑定的数量

字段别名


字段别名限制在查询领域,若是数据更新还是需要更新原有的数据字段,否则会出错。