索引别名

别名是一个虚拟索引名,可以指向一个或多个索引。

如果用户的数据分散在多个索引中,不必跟踪要查询哪些索引,可以创建一个别名并查询它。

例如,如果用户根据月份将日志存储到索引中,并且经常查询过去两个月的日志,可以创建一个 last_2_months 别名,并每月更新它指向的索引。

由于用户可以随时更改别名指向的索引,在应用程序中使用别名引用索引可以让用户在不停机的情况下重新索引数据。

创建别名

创建别名,使用 POST 请求:

POST _aliases

使用 actions 方法指定要执行的操作列表。此命令创建一个名为 alias1 的别名,并将 index-1 添加到此别名:

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "index-1",
        "alias": "alias1"
      }
    }
  ]
}

返回以下响应:

{
   "acknowledged": true
}

如果请求失败,请确保用户添加到别名的索引已经存在。

用户还可以使用以下请求之一创建别名:

PUT <index>/_aliases/<alias name>
POST <index>/_aliases/<alias name>
PUT <index>/_alias/<alias name>
POST <index>/_alias/<alias name>

上述请求中的 <index> 可以是索引名、逗号分隔的索引名列表或通配符表达式。使用 _all 引用所有索引。

要检查 alias1 是否引用 index-1,请运行以下命令之一:

GET /_alias/alias1
GET /index-1/_alias/alias1

要获取别名引用的索引的映射和设置信息,请运行以下命令:

GET alias1

添加或删除索引

用户可以使用同一个 _aliases 执行多个操作。例如,以下命令从 alias1 中删除 index-1 并添加 index-2

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "index-1",
        "alias": "alias1"
      }
    },
    {
      "add": {
        "index": "index-2",
        "alias": "alias1"
      }
    }
  ]
}

addremove 操作是原子性的,这意味着 alias1 不会同时指向 index-1index-2。用户还可以根据索引模式添加索引,如下面的 POST 请求所示:

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "index*",
        "alias": "alias1"
      }
    }
  ]
}

remove 操作还支持 must_exist 参数。如果参数设置为 true 且指定的别名不存在,则会抛出异常。如果参数设置为 false,则如果指定的别名不存在,则不采取任何操作。must_exist 的默认值为 null。仅当指定的别名都不存在时,才会抛出异常。

以下 POST 请求使用 remove 操作,并将 must_exist 参数设置为 true

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "index-1",
        "alias": "alias1",
        "must_exist": true
      }
    }
  ]
}

管理别名

要列出别名到索引的映射,请运行以下命令:

GET _cat/aliases?v

示例响应

alias   index           filter routing.index routing.search is_write_index
alias1  index-2         -      -             -              -

要检查别名指向哪些索引,请运行以下命令:

GET _alias/alias1

示例响应

{
  "index-2": {
    "aliases": {
      "alias1": {}
    }
  }
}

要查看索引有哪些别名,可以使用以下命令:

GET /index-2/_alias/*

要获取所有索引名及其别名,请运行以下命令:

GET /_alias

要检查别名是否存在,请运行以下命令之一:

HEAD /alias1/_alias/
HEAD /_alias/alias1/
HEAD index-1/_alias/alias1/

在创建索引时添加别名

用户可以在创建索引时将索引添加到别名中,如下面的 PUT 请求所示:

PUT index-3
{
  "aliases": {
    "alias1": {}
  }
}

创建过滤别名

用户可以创建过滤别名以访问底层索引中的文档子集或字段。此命令仅将特定的 timestamp 字段添加到 alias1。以下显示了示例 POST 请求:

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "index-1",
        "alias": "alias1",
        "filter": {
          "term": {
            "timestamp": "1574641891142"
          }
        }
      }
    }
  ]
}

索引别名选项

用户可以指定下表所示的选项。

选项 有效值 描述 必需
index 字符串 别名指向的索引名称。
alias 字符串 别名名称。
filter 对象 为别名添加过滤器。
routing 字符串 将搜索限制为关联的分片值。用户可以独立指定 search_routingindex_routing
is_write_index 字符串 指定接受任何写入操作的别名索引。如果未指定此值,则不允许任何写入操作。

删除别名

要从索引中删除一个或多个别名,请使用以下请求:

DELETE <index>/_alias/<alias>
DELETE <index>/_aliases/<alias>

上述请求中的 <index><alias> 都支持逗号分隔列表和通配符表达式。使用 _all 代替 <alias> 以删除 <index> 中列出的索引的所有别名。

例如,如果 alias1 引用 index-1index-2,用户可以运行以下命令从 index-1 中删除 alias1

DELETE index-1/_alias/alias1

运行请求后,alias1 不再引用 index-1,但仍引用 index-2