Elasticsearch中别名alias相关操作(创建更新删除)

Posted IT之一小佬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch中别名alias相关操作(创建更新删除)相关的知识,希望对你有一定的参考价值。

1、索引别名概述

        在Elasticsearch中,别名(alias)是一种将一个或多个索引(index)映射到一个逻辑名称上的方式。通过使用别名,我们可以为目标索引提供简洁、易于理解的名称,并将多个索引组合到一个别名下。

        例如,假设我们有两个索引分别存储了不同时间段的日志数据:log_2022_01和log_2022_02。我们可以将这两个索引的别名设置为logs,然后在查询时只需要使用logs别名即可查询所有日志数据。

2、创建别名

        当使用Elasticsearch时,可以创建别名来对索引进行分组、划分和隐藏。创建别名是一种将逻辑名称映射到一个或多个索引的方式,这使得在查询过程中能够快速地使用这些索引。

别名可以用于:

  • 对索引的不同版本进行切换
  • 将多个索引作为一个索引查询
  • 隐藏具有特定内容的索引
  • 进行索引修复和备份

2.1 使用API创建索引别名

        要为所选索引创建别名,请使用Elasticsearch提供的REST API,并发送一个PUT请求到/_aliases端点。API请求正文应该包含一个JSON对象,该对象定义了要添加的别名和相应的索引名称。例如,以下代码片段演示了如何为名为my_index的索引创建别名my_alias:

POST /_aliases

  "actions": [
    
      "add": 
        "index": "my_index",
        "alias": "my_alias"
      
    
  ]

        在上面的代码中,我们向/aliases端点发送了一个POST请求,并指定要添加的别名和所属的索引名称。这里使用了actions数组来指定要执行的操作。每个操作都由一个或多个键值对组成,其中add表示要添加一个别名,index表示要添加别名的索引名称,alias表示要创建的别名。

2.2 验证别名是否创建成功

        完成别名创建后,您可以使用GET /_cat/aliases API端点来检查已创建的所有别名及其所属的索引。例如,以下代码演示了如何列出所有别名:

GET /_cat/aliases?v

这将返回一个文本表格,其中包含每个别名和它们所属的索引。

        总之,当需要对Elasticsearch中的索引进行分组、划分或隐藏时,请考虑使用别名来实现。只需按照上述步骤,即可轻松创建并管理别名。

2.3 为多个索引创建别名

        除了为单个索引创建别名之外,我们还可以将一个别名映射到多个索引。例如,在以下代码中,我们将logs别名添加到名为log-2022-01和log-2022-02的两个索引中:

POST /_aliases

  "actions": [
    
      "add": 
        "index": "log-2022-01",
        "alias": "logs"
      
    ,
    
      "add": 
        "index": "log-2022-02",
        "alias": "logs"
      
    
  ]

        在上面的代码中,我们使用actions数组添加了两个操作,每个操作指定要将logs别名添加到不同的索引中。

2.4 更新别名

        如果需要更新现有别名的配置,可以使用/_aliases端点,并发送一个带有add和remove操作的请求。以下是一个示例代码片段,演示如何将名称为my_alias的别名从my_index1和my_index2索引中删除,并将其添加到my_index3上:

POST /_aliases

  "actions": [
    
      "remove": 
        "index": "my_index1",
        "alias": "my_alias"
      
    ,
    
      "remove": 
        "index": "my_index2",
        "alias": "my_alias"
      
    ,
    
      "add": 
        "index": "my_index3",
        "alias": "my_alias"
      
    
  ]

        在上面的代码中,我们使用actions数组添加了三个操作。前两个操作使用remove参数删除现有别名和相应的索引名称,第三个操作使用add参数将别名添加到新的索引上。

3、删除别名

3.1 删除单一索引别名

Elasticsearch中可以使用API来删除索引别名,具体步骤如下:

1. 打开Kibana控制台或使用其他HTTP客户端工具,例如curl;

2. 发送POST请求到/_aliases API端点,指定要删除别名的索引和别名名称。例如:

POST /_aliases

  "actions": [
    
      "remove": 
        "index": "my_index",
        "alias": "my_alias"
      
    
  ]

        在上述代码中,我们将my_alias别名从my_index索引中删除。您可以根据自己的需要修改索引名称和别名名称。

在上述代码中,我们使用/aliases API端点,并将以下内容包含在请求正文(body)中:

  • actions数组:由一个或多个“操作”组成,定义要执行的操作;
  • remove操作:表示要从指定索引中删除别名,需要提供索引名称和别名名称;
  • index:要从中删除别名的索引名称;
  • alias:要删除的别名名称。

3. 如果成功删除别名,则会返回JSON响应。如果发生错误,则会返回相应的错误消息。

        需要注意的是,Elasticsearch中的删除操作是不可逆的,请在执行删除操作之前仔细考虑并备份数据。同时,也需要注意保护数据安全和稳定性,避免在操作过程中出现意外故障和错误。

3.2 删除多个索引别名

        除了从单个索引中删除一个别名之外,我们还可以从多个索引中同时删除同一别名。例如,假设我们的logs别名同时映射到log_2022_01和log_2022_02两个索引。现在我们想要将其从这两个索引中删除,可以使用以下代码:

POST /_aliases

  "actions": [
    
      "remove": 
        "index": "log_2022_01",
        "alias": "logs"
      
    ,
    
      "remove": 
        "index": "log_2022_02",
        "alias": "logs"
      
    
  ]

        在上述代码中,我们在actions数组中添加了两个操作,分别指定要从log_2022_01和log_2022_02索引中删除logs别名。

3.3 批量删除索引别名

如果您需要批量删除多个索引别名,可以使用以下代码:

POST /_aliases

  "actions": [
    
      "remove": 
        "index": "my_index1",
        "alias": "my_alias"
      
    ,
    
      "remove": 
        "index": "my_index2",
        "alias": "my_alias"
      
    ,
    
      "remove": 
        "index": "my_index3",
        "alias": "my_alias"
      
    
  ]

        在这个例子中,我们通过/aliases端点发送一个POST请求,其中包括一个包含多个remove操作的数组。每个操作都指定了要从哪个索引中移除别名。

        需要注意的是,在执行此操作之前,请务必确保您已经备份了数据,并且仔细考虑了其潜在后果。

3.4 删除所有索引的别名

如果您需要删除所有索引上的所有别名,可以使用以下命令:

POST /_aliases

  "actions": [
    
      "remove": 
        "index": "_all",
        "alias": "*"
      
    
  ]

        在这个例子中,我们通过/aliases端点发送一个POST请求,并指定要移除所有索引的所有别名。这里我们将index参数设置为_all表示对所有索引进行操作,将alias参数设置为通配符*表示要移除所有别名。

        需要注意的是,在执行此操作之前,务必仔细考虑其后果,以及是否有数据备份等安全措施。

3.5 Elasticsearch删除索引别名的注意事项

在使用Elasticsearch的API来删除索引别名时,需要注意以下几点:

  • 删除别名是一个不可逆操作,请在执行此操作之前仔细考虑,并备份数据;
  • 在删除索引别名之前,请确保您已经备份了相关数据,并且有机制可以恢复数据;
  • 删除别名可能会影响索引的查询性能和数据访问方式,请谨慎考虑并测试;
  • 请遵循Elasticsearch最佳实践,如数据备份、权限管理等,以确保数据的安全和稳定性;
  • 如果您不确定如何使用某个API或操作,请始终参考官方文档或咨询专业人员的建议。

        总之,在使用Elasticsearch删除索引别名之前,需要全面评估其对数据和应用程序的影响,并采取适当的安全措施,以确保数据的安全和可靠性。

3.6 Elasticsearch删除索引别名的常见问题

以下是一些通常与Elasticsearch删除索引别名相关的常见问题:

  • Q: 如何查找特定别名所映射的所有索引?
  • A: 您可以使用GET /_cat/aliases/<alias> API端点来查找特定别名所映射的所有索引。
  • Q: 在删除索引别名时,会影响到与该别名关联的索引中存储的数据吗?
  • A: 不会。删除索引别名只会影响别名的存在方式,并不会对原始数据造成任何影响。
  • Q: 如果我误删了一个别名,如何恢复它?
  • A: 如果您已经备份了数据,可以使用PUT /<index>/_alias/<alias> API端点来重新创建别名。如果没有备份,则需要考虑其他恢复方法,如自动快照和灾难恢复等。
  • Q: 删除索引别名会影响搜索性能吗?
  • A: 可能会。如果您删除的别名被广泛使用且访问频繁,则可能会影响到搜索性能。因此,在删除索引别名之前,请务必评估其潜在影响,并测试其对查询性能的影响。

        总之,Elasticsearch删除索引别名是一个重要的操作,需要谨慎对待并遵循最佳实践。如果您有疑问或遇到问题,请参考官方文档或咨询专业人员的建议。

4、其他操作

        除了创建、删除别名之外,Elasticsearch还提供了其他许多用于管理索引和别名的API。例如,您可以使用/_cat/aliases API端点查看所有别名及其所属的索引。

Elasticsearch之别名

别名解决的问题

  在运行的集群中可以从一个索引切换到另一个索引

  可以给多个索引进行分组

  可以与路由搭配使用

别名的相关操作

准备数据阶段

PUT l1/doc/1

  "title":"我想要睡你"


PUT l2/doc/1

  "title":"你却拿我当兄弟"


PUT l3/doc/1

  "title":"不过,我不介意"

创建别名  给l1索引创建别名a1(_aliases  actions add)

POST _aliases

  "actions": [
    
      "add": 
        "index": "l1",
        "alias": "a1"
      
    
  ]

查看别名

GET l1/_alias

查看结果


  "l1" : 
    "aliases" : 
      "a1" :  
    
  

删除别名(actions remove)

POST _aliases

  "actions": [
    
      "remove": 
        "index": "l1",
        "alias": "a1"
      
    
  ]

重命名别名(淘汰旧的索引上的别名,生成新的索引上的别名)

POST _aliases

  "actions": [
    
      "remove": 
        "index": "l1",
        "alias": "a1"
      
    ,
    
      "add": 
        "index": "l2",
        "alias": "a1"
      
    
  ]

为多个索引指向同样的别名(证实为多个索引分组)

POST _aliases

  "actions": [
    "add": "index": "l1", "alias": "a1",
    "add": "index": "l2", "alias": "a1",
    "add": "index": "l3", "alias": "a1"
  ]

使用indeices数组语法在一个操作中为多个索引指向别名

多个索引指向同一别名

POST _aliases

  "actions": [
    "add": "indices": ["l1", "l2", "l3"], "alias": "a2"
  ]

一个索引指向多个别名

POST _aliases

  "actions": [
    "add": "index": "l1", "aliases": ["a1", "a2", "a3"]
  ]

将别名关联到拥有公共名称的索引(将索引 l1 l2 l3指向f1别名)

POST _aliases

  "actions": [
    "add": "index": "l*", "alias": "f1"
  ]

别名交换

POST _aliases

  "actions": [
    "add": "index": "l1", "alias": "a1",
    "remove_index":"index":"a1"
  ]


# 就像删除a1别名

过滤器别名

1.自定义索引

2.插入数据

3.普通查询和根据别名查询

PUT l4

  "mappings": 
    "doc":
      "properties":
        "year":
          "type":"integer"
        ,
        "method":
          "type":"keyword"
        
      
    
  



PUT l4/doc/1

  "year":2019,
  "method":"GET"

PUT l4/doc/2

  "year":2018,
  "method":"POST"

PUT l4/doc/3

  "year":2019,
  "method":"POST"


POST _aliases

  "actions": [
    
      "add": 
        "index": "l4",
        "alias": "a4",
        "filter": 
          "term": 
            "year": 2019
          
        
      
    
  ]


GET l4/doc/_search
GET a4/doc/_search

此时两种查询结果不同(带有过滤的只返回2019,而普通查询会全部返回)

与路由连用

简单实例

POST _aliases

  "actions": [
    
      "add": 
        "index": "l4",
        "alias": "a4",
        "routing": "2"
      
    
  ]

再列举一个

POST _aliases

  "actions": [
    
      "add": 
        "index": "l4",
        "alias": "a4",
        "search_routing": "1,2",
        "index_routing": "1"
      
    
  ]
GET a4/doc/_search?q=year:2019&routing=2
# 取交集2

写索引(如果多个索引指向一个别名,通过别名写索引,不指定es不知道)

POST _aliases

  "actions": [
    
      "add": 
        "index": "l1",
        "alias": "a1",
        "is_write_index": true
      
    ,
    
      "add": 
        "index": "l2",
        "alias": "a1"
      
    
  ]

添加单个别名

PUT index/_alias/name
PUT index/_alias/name?routing=user1
  • index,要为哪个索引添加别名。
  • name,别名的名称。
  • routing,可以与别名关联的路由。

删除别名

DELETE l1/_alias/a1
DELETE l2/_aliases/a*

检索现有别名

GET l1/_alias/a*    # 查询索引l1指向以a开头的所有别名
GET l1/_alias/*     # 查询索引l1所有的别名

查询所有别名是a1

GET /_alias/a1

HEAD检测别名是否存在

GET _cat/aliases
HEAD _alias/a1

 

以上是关于Elasticsearch中别名alias相关操作(创建更新删除)的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统之alias别名的基本使用

Linux-让alias别名永久生效

Linux-让alias别名永久生效

spring data elasticsearch多索引查询

按别名删除索引

Elasticsearch之别名