`
qindongliang1922
  • 浏览: 2188456 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117659
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126068
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60013
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71398
社区版块
存档分类
最新评论

如何在Elasticsearch里面使用索引别名

    博客分类:
  • ELK
阅读更多


在elasticsearch里面给index起一个aliases(别名)能非常优雅的解决两个索引无缝切换的问题,这个功能在某些场景下非常使用。

比如电商的核心商品索引库,除了实时增量数据外,每天都要重建一遍索引,避免index里面的数据和db里面的数据不一致,因为index分shard了,所以要一个一个的shard做全量替换,直到所有的shard替换完毕,才能宣布重建成功。整个过程其实还是风险挺大的,虽然每次只替换一个shard把风险量降到最低,但如果第3个或第4个shard重建有问题,有可能要回滚整个索引,这个问题其实用索引别名的问题就能比较优雅的解决。

旧索引称为a,新索引称为b,他们拥有共同的别名c,而dao层查询的索引名也是c,当新的全量索引b重建完成之后,只需要解除旧索引a与别名c关系,然后添加新索引b与别名c的关系,就能完成无缝切换,中间对用户是无感知的,如果b有问题,那么随时都可以重新解除b的关系并恢复a,这就完成了所谓的回滚操作,非常简单优雅。


在es里面index aliases就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:

(1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上

(2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引

(3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)



es里面操作索引别名的有两个api命令:

````
_alias 执行单个别名操作

_aliases 原子的执行多个别名操作

````


如何使用?

假设我们有两个索引分别是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 添加新的别名,这样以来
索引就透明的别切换了,用户不会感觉任何变化,而且也不需要停机操作。


下面看下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服务端知道它的类型。


总结:

本文介绍了es里面别名的功能和作用并讲解了如何使用别名,如果我们的索引不确定未来如何使用时,给索引加一个别名是一个不错的选择。



有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

0
0
分享到:
评论

相关推荐

    elasticsearch运维实践

    Elasticsearch是一个功能强大且灵活的搜索引擎,需要深入理解其架构、数据存储、读写流程、节点类型、索引管理、别名、快照、分词器和性能优化等方面的知识点,以便更好地使用和运维Elasticsearch。

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...

    Elasticsearch 34道面试题和答案.docx

    本文档总结了 34 道 Elasticsearch 面试题和答案,涵盖了 Elasticsearch 的基础概念、索引架构、集群管理、性能优化、倒排索引、master 选举等多个方面。 一、Elasticsearch 基础概念 1. 什么是 Elasticsearch?...

    elasticsearch数据结构设计文档

    Elasticsearch 数据结构设计文档是 ES 中的核心概念,用于定义索引的逻辑结构和字段设计。该设计主要包括索引类型别名、索引名称、类型名称、字段名称、字段类型、字段描述等几个方面。同时,该设计还涉及到 ES 的...

    Elasticsearch入门学习笔记

    在Elasticsearch中,创建索引类似于关系型数据库创建数据库。你可以通过发送PUT请求到服务器创建索引,例如使用Postman向`http://localhost:9200/shopping`发送请求。一旦索引创建成功,Elasticsearch会返回确认信息...

    基于Elasticsearch Java API的参考手册

    4. **索引别名(Aliases)**: 提供一种对多个索引进行操作的抽象,方便管理和维护。 5. **性能优化**: 合理设置刷新间隔、warmer预热、缓存策略等,提升系统性能。 通过深入理解和熟练运用Elasticsearch的Java API,...

    elastic search 7.6.2 查询

    在 Elasticsearch 中,数据存储的基本单位是索引。索引的创建是通过定义索引的映射、写入数据和建立倒排索引来实现的。索引的名称必须是小写的,不可重名。 二、映射 映射就是对索引库中索引的字段名称及其数据...

    ElasticSearch面试题 30道1

    Elasticsearch的倒排索引是基于FST(有限状态转换器)数据结构实现的,该结构在空间占用和查询速度上都有优秀表现。 2. **大数据量的索引管理与调优**: - **设计阶段**:根据业务需求,采用基于日期的索引模板和...

    elasticsearch-7.4.2

    - **类型(Type)**:在7.x版本中已被弃用,但之前用于组织索引中的文档,现在被映射为一个索引的别名或“映射”。 - **文档(Document)**:索引中的基本存储单元,类似JSON格式的数据对象。 - **映射(Mapping)**:...

    spring-data-elasticsearch

    `spring-data-elasticsearch-sample-application-master` 是一个包含整合示例的项目,它展示了如何在实际应用中使用 Spring Data Elasticsearch。这个项目可能包含了以下部分: 1. **配置**: 应用的配置文件(如 `...

    【elasticsearch】 ElasticSearch的其他脚本

    在描述中提到的 `es_precreate_indices.py` 是一个 Python 脚本,可能用于在 Elasticsearch 中预先创建索引。这个脚本可能是为了在系统启动前配置好索引结构,设置映射(mapping),或者执行初始化操作,如设置别名...

    ElasticSearch Server

    为了提高搜索的灵活性和易用性,ElasticSearch引入了别名(Alias)和索引别名(Index Alias)的概念。别名可以简化数据操作,例如,在不影响查询性能的情况下,可以将多个索引视为一个逻辑索引进行查询。索引别名...

    000057_ElasticSearch开发规范.docx

    - 使用索引别名:别名可以指向多个索引,方便管理和更新,避免直接操作索引名称导致的问题。 - 类型编码规范: - 映射到 Hive 表字段时,应保持字段命名的一致性,以便数据迁移和处理。 3. ES 分片副本设计规范 ...

    ElasticSearch 7.6.1 整合 SpringBoot 快速使用教程

    在本教程中,我们将深入探讨如何将Elasticsearch 7.6.1版本与Spring Boot应用程序进行集成,以便实现高效、灵活的全文检索和数据分析功能。Elasticsearch是一款开源的分布式搜索引擎,它提供了实时分析、搜索、存储...

    Laravel开发-elasticsearch

    配置好服务提供者和服务别名,然后在`.env`文件中添加Elasticsearch的连接信息。 2. **Laravel查询生成器** 为了简化与Elasticsearch的交互,可以使用专门的Laravel查询构建器,如`scout-elasticsearch-driver`。...

    elasticsearch6.7.0-linux

    - 通过索引模板和别名,Elasticsearch 支持在同一集群上管理多个独立的应用或用户,实现资源隔离和灵活的数据管理。 总结来说,Elasticsearch 6.7.0 for Linux 是一款强大的全文搜索引擎,具备分布式、RESTful、...

    浅入深出ElasticSearch构建高性能搜索架构.docx

    4. **课时12:实战es的java客户端**:通过编写Java代码与ElasticSearch进行交互,了解客户端的使用技巧。 5. **课时25:分组查询(aggregation)**:学习如何使用聚合查询功能,以获得更丰富的统计数据。 6. **课时30...

Global site tag (gtag.js) - Google Analytics