别名编辑

别名是数据流或索引组的二级名称。大多数 Elasticsearch API 接受别名来代替数据流或索引名称。

您可以随时更改别名的数据流或索引。如果您在应用程序的 Elasticsearch 请求中使用别名,则可以重新索引数据,而不会造成停机或更改应用程序代码。

别名类型编辑

别名有两种类型

  • 一个 数据流别名 指向一个或多个数据流。
  • 一个 索引别名 指向一个或多个索引。

别名不能同时指向数据流和索引。您也不能将数据流的备份索引添加到索引别名中。

添加别名编辑

要将现有数据流或索引添加到别名,请使用 别名 APIadd 操作。如果别名不存在,则请求会创建它。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        add: {
          index: 'logs-nginx.access-prod',
          alias: 'logs'
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    }
  ]
}

API 的 indexindices 参数支持通配符 (*)。与数据流和索引都匹配的通配符模式将返回错误。

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

删除别名编辑

要删除别名,请使用别名 API 的 remove 操作。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        remove: {
          index: 'logs-nginx.access-prod',
          alias: 'logs'
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    }
  ]
}

多个操作编辑

您可以使用别名 API 在单个原子操作中执行多个操作。

例如,logs 别名指向单个数据流。以下请求将流替换为别名。在此交换期间,logs 别名没有停机时间,并且永远不会同时指向两个流。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        remove: {
          index: 'logs-nginx.access-prod',
          alias: 'logs'
        }
      },
      {
        add: {
          index: 'logs-my_app-default',
          alias: 'logs'
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    },
    {
      "add": {
        "index": "logs-my_app-default",
        "alias": "logs"
      }
    }
  ]
}

多个操作结果编辑

当使用多个操作时,如果一些操作成功而另一些操作失败,则将返回每个操作结果的列表。

考虑与上一个示例类似的操作列表,但现在使用别名 log-non-existing,该别名尚不存在。在这种情况下,remove 操作将失败,但 add 操作将成功。响应将包含列表 action_results,其中包含每个请求操作的结果。

POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "index1",
        "alias": "logs-non-existing"
      }
    },
    {
      "add": {
        "index": "index2",
        "alias": "logs-non-existing"
      }
    }
  ]
}

API 返回以下结果

{
  "acknowledged": true,
  "errors": true,
  "action_results": [
    {
      "action": {
        "type": "remove",
        "indices": [ "index1" ],
        "aliases": [ "logs-non-existing" ],
      },
      "status": 404,
      "error": {
        "type": "aliases_not_found_exception",
        "reason": "aliases [logs-non-existing] missing",
        "resource.type": "aliases",
        "resource.id": "logs-non-existing"
      }
    },
    {
      "action": {
        "type": "add",
        "indices": [ "index2" ],
        "aliases": [ "logs-non-existing" ],
      },
      "status": 200
    }
  ]
}

允许操作列表部分成功可能无法提供所需的结果。将 must_exist 设置为 true 可能更合适,这将导致如果单个操作失败,则整个操作列表失败。

在索引创建时添加别名编辑

您还可以使用 组件索引模板 在创建索引或数据流别名时添加它们。

response = client.cluster.put_component_template(
  name: 'my-aliases',
  body: {
    template: {
      aliases: {
        "my-alias": {}
      }
    }
  }
)
puts response

response = client.indices.put_index_template(
  name: 'my-index-template',
  body: {
    index_patterns: [
      'my-index-*'
    ],
    composed_of: [
      'my-aliases',
      'my-mappings',
      'my-settings'
    ],
    template: {
      aliases: {
        "yet-another-alias": {}
      }
    }
  }
)
puts response
# Component template with index aliases
PUT _component_template/my-aliases
{
  "template": {
    "aliases": {
      "my-alias": {}
    }
  }
}

# Index template with index aliases
PUT _index_template/my-index-template
{
  "index_patterns": [
    "my-index-*"
  ],
  "composed_of": [
    "my-aliases",
    "my-mappings",
    "my-settings"
  ],
  "template": {
    "aliases": {
      "yet-another-alias": {}
    }
  }
}

您还可以在 创建索引 API 请求中指定索引别名。

response = client.indices.create(
  index: '<my-index-{now/d}-000001>',
  body: {
    aliases: {
      "my-alias": {}
    }
  }
)
puts response
# PUT <my-index-{now/d}-000001>
PUT %3Cmy-index-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "my-alias": {}
  }
}

查看别名编辑

要获取集群别名的列表,请使用 获取别名 API,不带任何参数。

response = client.indices.get_alias
puts response
GET _alias

_alias 之前指定数据流或索引以查看其别名。

response = client.indices.get_alias(
  index: 'my-data-stream'
)
puts response
GET my-data-stream/_alias

_alias 之后指定别名以查看其数据流或索引。

response = client.indices.get_alias(
  name: 'logs'
)
puts response
GET _alias/logs

写入索引编辑

您可以使用 is_write_index 为别名指定写入索引或数据流。Elasticsearch 将别名的任何写入请求路由到此索引或数据流。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        add: {
          index: 'logs-nginx.access-prod',
          alias: 'logs'
        }
      },
      {
        add: {
          index: 'logs-my_app-default',
          alias: 'logs',
          is_write_index: true
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "logs-nginx.access-prod",
        "alias": "logs"
      }
    },
    {
      "add": {
        "index": "logs-my_app-default",
        "alias": "logs",
        "is_write_index": true
      }
    }
  ]
}

如果别名指向多个索引或数据流,并且未设置 is_write_index,则别名将拒绝写入请求。如果索引别名指向一个索引,并且未设置 is_write_index,则该索引将自动充当写入索引。数据流别名不会自动设置写入数据流,即使别名指向一个数据流也是如此。

我们建议使用数据流来存储仅追加的时间序列数据。如果您需要更新或删除现有时间序列数据,则可以直接在数据流备份索引上执行更新或删除操作。如果您经常使用相同的 _id 发送多个文档,并期望最后写入获胜,则可能需要使用带有写入索引的索引别名。请参阅 在没有数据流的情况下管理时间序列数据

过滤别名编辑

filter 选项使用 查询 DSL 来限制别名可以访问的文档。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        add: {
          index: 'my-index-2099.05.06-000001',
          alias: 'my-alias',
          filter: {
            bool: {
              filter: [
                {
                  range: {
                    "@timestamp": {
                      gte: 'now-1d/d',
                      lt: 'now/d'
                    }
                  }
                },
                {
                  term: {
                    'user.id' => 'kimchy'
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "my-index-2099.05.06-000001",
        "alias": "my-alias",
        "filter": {
          "bool": {
            "filter": [
              {
                "range": {
                  "@timestamp": {
                    "gte": "now-1d/d",
                    "lt": "now/d"
                  }
                }
              },
              {
                "term": {
                  "user.id": "kimchy"
                }
              }
            ]
          }
        }
      }
    }
  ]
}

过滤器仅在使用 查询 DSL 时应用,在 通过 ID 检索文档 时不应用。

路由编辑

使用 routing 选项将 路由 别名的请求到特定分片。这使您可以利用 分片缓存 来加速搜索。数据流别名不支持路由选项。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        add: {
          index: 'my-index-2099.05.06-000001',
          alias: 'my-alias',
          routing: '1'
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "my-index-2099.05.06-000001",
        "alias": "my-alias",
        "routing": "1"
      }
    }
  ]
}

使用 index_routingsearch_routing 为索引和搜索指定不同的路由值。如果指定,这些选项将覆盖其各自操作的 routing 值。

response = client.indices.update_aliases(
  body: {
    actions: [
      {
        add: {
          index: 'my-index-2099.05.06-000001',
          alias: 'my-alias',
          search_routing: '1',
          index_routing: '2'
        }
      }
    ]
  }
)
puts response
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "my-index-2099.05.06-000001",
        "alias": "my-alias",
        "search_routing": "1",
        "index_routing": "2"
      }
    }
  ]
}