ElasticSearch-基础-08-别名
2025-01-22 08:19:30    1.2k 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

ElasticSearch-基础-04-索引_名词 中提到了别名,elasticsearch 中别名有两种分类:索引别名字段别名


1. 索引别名

别名可以 映射/指向 到 一个或多个索引,并且可以在任何需要索引名称的API中使用。为了在不停服务的情况下增加容量,实现零停机,使用索引别名是一个很好的解决方案。

  • 创建一个新的索引存储新的数据
  • 同时搜索两个索引来获取新数据和旧数据

使用别名的话,对于查询系统而言,添加一个新索引 或 切换索引,是毫无感觉的。不过注意:别名不能与索引的名字一样。


1.1. 效率

使用别名的效率和直接索引效率一样吗?

它们的效率是一致的。前提是,别名和索引都指向相同的数据。因为,索引别名只是 物理索引的软连接而已。


1.2. 示例

创建几个名字差不多的索引,my_index_1/my_index_2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PUT /my_index_1
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"my_index_type": {
"properties": {
"bookId": {
"type": "long"
},
"bookName": {
"type": "text"
},
"publishDate": {
"type": "date"
}
}
}
}
}

设置索引别名:my_index,并指向my_index_1/my_index_2

1
2
3
PUT /my_index_1/_alias/my_index

PUT /my_index_2/_alias/my_index

通过 elasticsearch-head工具可以看到,索引名字下已经标注别名。

索引别名-head

查看my_index别名,指向了哪些索引

1
GET /*/_alias/my_index

返回结果

1
2
3
4
5
6
7
8
9
10
11
12
{
"my_index_2" : {
"aliases" : {
"my_index" : { }
}
},
"my_index_1" : {
"aliases" : {
"my_index" : { }
}
}
}

查看my_index_1索引,指向了哪些别名

1
GET /my_index_1/_alias/*

返回结果

1
2
3
4
5
6
7
{
"my_index_1" : {
"aliases" : {
"my_index" : { }
}
}
}

1.3. 官方示例

添加索引到别名

1
2
3
4
5
6
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } }
]
}

同时添加多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /_aliases
{
"actions" : [
{ "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }
]
}



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

删除别名下的索引

1
2
3
4
5
6
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } }
]
}

新增和删除可以一起

1
2
3
4
5
6
7
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test2", "alias" : "alias1" } }
]
}

1.4. 场景

假如现在需要新增一个字段,修改my_index_1/my_index_2的mapping。

此时我们需要重新创建索引my_index_3,并设置mapping。

接下来要做的是,将my_index_3加入my_index别名中,同时将my_index_1/my_index_2从my_index别名中移除。

  1. 创建新的索引 my_index_3 和 my_index_4,并设置mapping

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    PUT /my_index_3
    {
    "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
    },
    "mappings": {
    "my_index_type": {
    "properties": {
    "bookId": {
    "type": "long"
    },
    "bookName": {
    "type": "text"
    },
    "publishDate": {
    "type": "date"
    },
    "price":{
    "type":"double"
    }
    }
    }
    }
    }

    PUT /my_index_4
    {
    "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
    },
    "mappings": {
    "my_index_type": {
    "properties": {
    "bookId": {
    "type": "long"
    },
    "bookName": {
    "type": "text"
    },
    "publishDate": {
    "type": "date"
    },
    "price":{
    "type":"double"
    }
    }
    }
    }
    }
  2. 将my_index_3 和 my_index_4 索引加入 my_index别名,同时移别名下除旧的索引

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    POST /_aliases
    {
    "actions": [
    {
    "remove": {
    "index": "my_index_1",
    "alias": "my_index"
    }
    },
    {
    "remove": {
    "index": "my_index_2",
    "alias": "my_index"
    }
    },
    {
    "add": {
    "index": "my_index_3",
    "alias": "my_index"
    }
    },
    {
    "add": {
    "index": "my_index_4",
    "alias": "my_index"
    }
    }
    ]
    }

查看elasticsearch-head

新增-移除-别名

在没有重启的情况下,动态转移了底层的索引,对上层应用毫无感知。


1.5. 查询

查询的话,和普通查询没有区别,只是将索引名称替换为别名(不过要注意,不建议加type)

例如:

1
2
3
4
5
6
7
8
GET /test_alias/_search
{
"query": {
"match": {
"_id": "jgHedm0BlZflrSMOm5pD"
}
}
}

1.6. 注意

索引的别名不是所有地方都通用,写数据的时候,需要指明物理索引的名字,不要向别名写数据。


2. 字段别名

字段别名是6.4+版本才有的字段类型。

暂时放着…


3. Reference