索引别名
别名是一个虚拟索引名称,可以指向一个或多个索引。
如果您的数据分散在多个索引中,您无需跟踪要查询哪些索引,而是可以创建一个别名并查询它。
例如,如果您根据月份将日志存储到索引中,并且经常查询前两个月的日志,则可以创建一个名为 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
操作执行多个动作。例如,以下命令将 index-1
从 alias1
中移除,并将 index-2
添加到 alias1
中。
POST _aliases
{
"actions": [
{
"remove": {
"index": "index-1",
"alias": "alias1"
}
},
{
"add": {
"index": "index-2",
"alias": "alias1"
}
}
]
}
add
和 remove
操作是原子性发生的,这意味着 alias1
不会同时指向 index-1
和 index-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
alias1 index-1 * - -
要检查别名指向哪些索引,请运行以下命令
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-1
{
"aliases": {
"alias1": {}
}
}
创建过滤别名
您可以创建过滤别名以访问底层索引中的文档或字段子集。此命令仅将特定时间戳字段添加到 alias1
。以下显示了一个示例 POST 请求
POST _aliases
{
"actions": [
{
"add": {
"index": "index-1",
"alias": "alias1",
"filter": {
"term": {
"timestamp": "1574641891142"
}
}
}
}
]
}
索引别名选项
您可以指定下表所示的选项。
选项 | 有效值 | 描述 | 必需 |
---|---|---|---|
index | 字符串 | 别名指向的索引名称。 | 是 |
alias | 字符串 | 别名名称。 | 否 |
filter | 对象 | 为别名添加过滤器。 | 否 |
路由 | 字符串 | 将搜索限制为关联的分片值。您可以独立指定 search_routing 和 index_routing 。 | 否 |
is_write_index | 字符串 | 指定接受对别名的任何写入操作的索引。如果未指定此值,则不允许任何写入操作。 | 否 |
删除别名
要从索引中删除一个或多个别名,请使用以下请求
DELETE <index>/_alias/<alias>
DELETE <index>/_aliases/<alias>
上述请求中的 <index>
和 <alias>
都支持逗号分隔列表和通配符表达式。使用 _all
代替 <alias>
可以删除 <index>
中列出的所有索引的别名。
例如,如果 alias1
指向 index-1
和 index-2
,您可以运行以下命令从 index-1
中移除 alias1
。
DELETE index-1/_alias/alias1
运行请求后,alias1
不再指向 index-1
,但仍然指向 index-2
。