序言
Elasticsearch提供了很多开发与运维便利的特性,很多特性看起来微不足道,需要时感慨真是卧虎藏龙。
以下围绕Elasticsearch提供的别名特性展开,主要探讨几个方面:
1.别名的应用类型
2.别名的应用场景
需求背景
早期基于Lucene自主开发搜索应用,定期重新生成索引,之后应用访问平滑的切换,需要做一大堆的辅助工作,后接触到Elasticsearch,提供了索引别名特性,很容易完成切换。
应用场景
Elasticsearch提供了两种别名机制:
1.索引别名
2.字段别名
索引别名
Elasticsearch索引本质上是个虚拟的空间,本后的实际数据存储查询都是由分片完成,索引访问索引本身也是通过索引代理实现,可以这样理解,默认索引别名就是索引名称本身。
索引别名,应用在索引访问层面。
1.应用索引重建切换
在应用系统中,索引需要定期维护,如索引重建,重建时为了不影响线上系统应用,一般会重新创建新的索引,待新索引数据重建完成,就需要无缝的替换掉原有索引,这个时候就需要引入索引别名
2.应用索引外部隔离
互联网行业中,典型的如电商订单场景,有实时订单与历史订单;常规设计有实时订单索引与历史订单索引分开,实时索引存储最近未完成的订单数据,如最近30天内;历史索引则相当于全量的订单数据,相比实时会有一些延迟,历史的数量非常的庞大,一般也会拆分成很多个索引,访问历史索引数据可以通过别名来指定,绑定所有历史索引,而不用人工指定索引查询,这带来了很便利。
3.应用索引内部隔离
索引创建多了,集群需要管理更多的元数据,消耗更多的管理节点资源,如果索引本身数量不是很大,可以将很多数据合并到一个索引中,对外采用多别名的方式隔离,每个别名仅限其中某些类型的数据访问。
字段别名
字段别名,更容易理解,应用在字段访问层面。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
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.索引别名可绑定多个索引,单个索引也可绑定多个索引别名,注意控制双向绑定的数量
字段别名
字段别名限制在查询领域,若是数据更新还是需要更新原有的数据字段,否则会出错。