• Index Aliases,索引别名,有点类似名称映射,一个索引别名可以映射多个真实索引,索引别名在定义时还支持filter,构成同一个索引,不同的视图。
  • 别名不能与关联的索引具有相同的名称;

1. Add index alias API

  • 创建或更新索引别名;

    1. PUT /<index>/_alias/<alias>
  • Path parameters:

    • (必须)
      • 用逗号隔开的索引名列表,或索引名称的通配符表达式;
      • 要将集群中所有的索引添加导别名中,使用 _all;
      • 索引别名的名称;
  • Query parameters:
    • master_timeout:(可选,时间单位) 指定等待连接到主节点的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。
    • timeout:(可选,时间单位) 指定等待响应的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。
  • Request body:

    • filter:(必需的,查询对象) 筛选查询,用于限制索引别名。
      • 如果指定,则索引别名仅适用于筛选过滤后返回的文档。
    • routing:(可选的,字符串) 自定义路由值,用于将操作路由到特定的切分。
  • 示例:

    • 添加一个基于时间的别名

      • 下面的请求为 logs_20302801 索引创建别名 2030;
        1. PUT /logs_20302801/_alias/2030
    • 添加基于用户的别名

      • 首先,创建一个索引 users,为 user_id 字段创建一个映射;
      • 然后添加特定用户 user_12 的索引别名:
        ###### 1
        PUT /users
        {
        "mappings" : {
        "properties" : {
        "user_id" : {"type" : "integer"}
        }
        }
        }
        ###### 2
        PUT /users/_alias/user_12
        {
        "routing" : "12",
        "filter" : {
        "term" : {
        "user_id" : 12
        }
        }
        }
        
    • 在索引创建期间添加别名

      • 您可以使用 create index API 在索引创建期间添加索引别名;
        PUT /logs_20302801
        {
        "mappings": {
        "properties": {
        "year": { "type": "integer" }
        }
        },
        "aliases": {
        "current_day": {},
        "2030": {
        "filter": {
        "term": { "year": 2030 }
        }
        }
        }
        }
        

2. Delete index alias API

  • 删除现有索引别名。

    DELETE /<index>/_alias/<alias>
    
  • Path parameters:

    • :(必须)
      • 用逗号隔开的索引名列表,或索引名称的通配符表达式;
      • 要包含集群中所有的索引,使用 _all 或 *;
    • :(必须)
      • 要删除的索引别名列表,可以是逗号隔开的列表,或索引别名的通配符表达式;
      • 要删除所有别名,使用 _all 或 *;
  • Query parameters:
    • master_timeout:(可选,时间单位) 指定等待连接到主节点的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。
    • timeout:(可选,时间单位) 指定等待响应的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。

3. Get index alias API

  • 返回一个或多个别名的信息;

    GET /<index>/_alias/<alias>
    
  • Path parameters:

    • :(必须)
      • 用逗号隔开的索引名列表,或索引名称的通配符表达式;
      • 要包含集群中所有的索引,使用 _all 或 *;
    • :(必须)
      • 要删除的索引别名列表,可以是逗号隔开的列表,或索引别名的通配符表达式;
      • 要删除所有别名,使用 _all 或 *;
  • Query parameters:

    • allow_no_indices:(可选,布尔值)
      • 默认值为 true ,假如通配符表达式或 _all 仅检索丢失或关闭的索引,那么请求不会返回 Error;
      • 这个参数让索引别名可以指向一个丢失或关闭的索引;
    • expand_wildcards:(可选,字符串)
      • 控制通配符表达式可以扩展到什么类型的索引。使用逗号分隔时可以接收多个值,如 open、hidden。默认值 all,有效值:
        • all:展开打开和关闭索引,包括隐藏索引;
        • open:只展开到打开的索引;
        • closed:只展开到闭合的索引;
        • hidden:通配符的扩展将包括隐藏索引。必须与 open、closed 或两者结合使用;
        • none:不接受通配符表达式;
    • ignore_unavailable:(可选,布尔值)
      • 如果为真,则响应中不包括缺失或关闭索引。默认值为 false
    • local:(可选,布尔值)
      • 如果为真,则请求仅从本地节点检索信息。默认值为 false,这意味着从主节点检索信息。
  • 示例:

    • 获取一个索引的所有别名,或指定别名
      • 可以在索引创建的时候配置多个索引别名; ```json

        1. 创建索引时,添加两个别名

        别名 2030,仅返回 logs_20302801 索引中 year=2030 的文档;

        PUT /logs_20302801 { “aliases” : { “current_day” : {}, “2030” : { “filter” : { “term” : {“year” : 2030 } } } } }

        获取索引下的所有别名信息

        GET /logs_20302801/_alias/_all

获取指定的别名信息

GET /_alias/2030

基于通配符获取别名

GET /_alias/20*


<a name="wLhae"></a>
# 4. Index alias exists API

- 检查索引别名是否存在;
```json
HEAD /_alias/<alias>
HEAD /<index>/_alias/<alias>
  • Path parameters:
    • :(必须)
      • 用逗号隔开的索引名列表,或索引名称的通配符表达式;
      • 要包含集群中所有的索引,使用 _all 或 *;
    • :(必须)
      • 要删除的索引别名列表,可以是逗号隔开的列表,或索引别名的通配符表达式;
      • 要删除所有别名,使用 _all 或 *;
  • Query parameters:
    • expand_wildcards:(可选,字符串)
      • 控制通配符表达式可以扩展到什么类型的索引。使用逗号分隔时可以接收多个值,如 open、hidden。默认值 all,有效值:
        • all:展开打开和关闭索引,包括隐藏索引;
        • open:只展开到打开的索引;
        • closed:只展开到闭合的索引;
        • hidden:通配符的扩展将包括隐藏索引。必须与 open、closed 或两者结合使用;
        • none:不接受通配符表达式;
    • ignore_unavailable:(可选,布尔值)
      • 如果为真,则响应中不包括缺失或关闭索引。默认值为 false
    • local:(可选,布尔值)
      • 如果为真,则请求仅从本地节点检索信息。默认值为 false,这意味着从主节点检索信息。
  • Response codes:

    • 200:代表所有指定的别名都存在;
    • 404:代表一个或多个指定的别名不存在;
  • 示例:

    HEAD /_alias/2030
    HEAD /_alias/20*
    HEAD /logs_20302801/_alias/*
    

5. Update index alias API

  • 添加或移除索引别名;

    POST /_aliases
    {
    "actions" : [
      { "add" : { "index" : "twitter", "alias" : "alias1" } }
    ]
    }
    
  • Query parameters:

    • master_timeout:(可选,时间单位) 指定等待连接到主节点的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。
    • timeout:(可选,时间单位) 指定等待响应的时间。如果在超时到期前没有收到响应,则请求失败并返回错误。默认为30s。
  • Request body:
    • actions:(必须,数组)
      • add:给索引添加一个别名
      • remove:从索引中移除一个别名;
      • remove_index:删除一个索引,或别名,和 delete index API 一样的效果;
      • action object:
        • index:索引名的通配符表达式(与 indices 必须二选一);
        • indices:索引名数组(与 index 必须二选一);
        • alias:别名通配符,或用逗号隔开的别名列表(与 aliases 必须二选一);
        • aliases :别名数组(与 alias 必须二选一);
        • filter:(可选)将筛选后的结果映射到别名;
        • is_hidden:(可选,布尔值) 如果为真,默认情况下将从通配符表达式中排除别名,除非在请求中使用 expand_wildcards 参数进行覆盖,类似于隐藏索引。此属性必须在共享别名的所有索引上设置为相同的值。默认值为false。
        • is_write_index:(可选,布尔值) 如果为真,则将这个索引设为别名的写索引。默认值为 false。
          • 一个别名同一时间只能有一个写索引;
          • 没有为索引显式设置 “is_write_index: true” 且只关联了一个索引的别名,将使被关联的索引表现为写索引,直到关联了另一个索引为止。
        • routing:(可选的,字符串) 自定义路由值,用于将操作路由到特定的切分。
        • index_routing:(可选的,字符串) 自定义路由值,用于别名的索引操作。
        • search_routing:(可选的,字符串) 自定义路由值,用于别名的搜索引操作。

:::danger

  • 将一个索引关联到多个别名,是会报错的;
  • 当使用通配符匹配索引名,去关联别名时,别名关联的只是此刻匹配到的索引;之后新增的符合匹配的索引,或删除一个匹配的索引,别名关联的索引是不会更新的;
  • actions 中如果任意一个报错,所有的操作都会无效;
  • 别名与关联的索引名称不能具有相同的名称;
  • 别名和 filter 提供了一种简单的方法来创建相同索引的不同“视图”;
  • routing 可以与 filter 一起使用,避免不必要的分片操作;
  • 搜索 routing 可以包含多个逗号隔开的值,索引 routing 只能指定一个值;
  • 同一时刻,别名只能有一个写索引;
  • 如果别名关联了多个索引,且没有指定写索引,那么写操作不被允许; :::

  • 示例: ```json

    添加一个别名

    POST /_aliases { “actions” : [ { “add” : { “index” : “test1”, “alias” : “alias1” } } ] }

移除一个别名

POST /_aliases { “actions” : [ { “remove” : { “index” : “test1”, “alias” : “alias1” } } ] }

重命名一个别名,先删除旧的再添加新的

POST /_aliases { “actions” : [ { “remove” : { “index” : “test1”, “alias” : “alias1” } }, { “add” : { “index” : “test1”, “alias” : “alias2” } } ] }

将一个别名关联到多个索引

POST /_aliases { “actions” : [ { “add” : { “index” : “test1”, “alias” : “alias1” } }, { “add” : { “index” : “test2”, “alias” : “alias1” } } ] }

POST /_aliases { “actions” : [ { “add” : { “indices” : [“test1”, “test2”], “alias” : “alias1” } } ] }

使用通配符将多个索引关联到别名,别名的关联不会自动更新,只关联现在匹配的索引;

POST /_aliases { “actions” : [ { “add” : { “index” : “test*”, “alias” : “all_test_indices” } } ] }

如果创建的索引后发现弄错了,可以将名称映射到正确创建的索引上

PUT test #———————-错误创建的索引 PUT test_2 #———————-正确创建的索引 POST /_aliases { “actions” : [ { “add”: { “index”: “test_2”, “alias”: “test” } }, #———-映射到想要的别名上 { “remove_index”: { “index”: “test” } } #———-删除索引 ] }

过滤后的别名

要创建有过滤的别名,首先我们需要确保字段已经存在于映射中:

PUT /test1 { “mappings”: { “properties”: { “user” : { “type”: “keyword” } } } } POST /_aliases { “actions”: [ { “add”: { “index”: “test1”, “alias”: “alias2”, “filter”: { “term”: { “user”: “kimchy” } } } } ] }

routing

1. 别名被创建后,所有的操作自动使用 1 作为 routing 值;

POST /_aliases { “actions”: [ { “add”: { “index”: “test”, “alias”: “alias1”, “routing”: “1” } } ] }

2. 可以给搜索与索引指定不同的 routing 值;

POST /_aliases { “actions”: [ { “add”: { “index”: “test”, “alias”: “alias2”, “search_routing”: “1,2”, “index_routing”: “2” } } ] }

如果搜索操作使用 routing:1,2,并且别名也设置了search_routing:2,3,

并且两个routing有交集2,那么使用这个交集2作为 routing

GET /alias2/_search?q=user:kimchy&routing=2,3

别名指向多个索引,且配置了写索引,如果通过别名执行Index和Update操作,那么只在写索引上执行;

aliases API 和 index creation API 来设置写索引

POST /_aliases { “actions”: [ { “add”: { “index”: “test”, “alias”: “alias1”, “is_write_index”: true } }, { “add”: { “index”: “test2”, “alias”: “alias1” } } ] }

交换写索引指向的索引

POST /_aliases { “actions”: [ { “add”: { “index”: “test”, “alias”: “alias1”, “is_write_index”: false } }, { “add”: { “index”: “test2”, “alias”: “alias1”, “is_write_index”: true } } ] } ```