别名
编辑别名编辑
别名是数据流或索引组的二级名称。大多数 Elasticsearch API 接受别名来代替数据流或索引名称。
您可以随时更改别名的数据流或索引。如果您在应用程序的 Elasticsearch 请求中使用别名,则可以重新索引数据,而不会造成停机或更改应用程序代码。
别名类型编辑
别名有两种类型
- 一个 数据流别名 指向一个或多个数据流。
- 一个 索引别名 指向一个或多个索引。
别名不能同时指向数据流和索引。您也不能将数据流的备份索引添加到索引别名中。
添加别名编辑
要将现有数据流或索引添加到别名,请使用 别名 API 的 add
操作。如果别名不存在,则请求会创建它。
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 的 index
和 indices
参数支持通配符 (*
)。与数据流和索引都匹配的通配符模式将返回错误。
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_routing
和 search_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" } } ] }