ElasticSearch版本:6.5.0(点击跳转官方文档)
在 ElasticSearch-基础-04-索引_名词 中提到了别名,elasticsearch 中别名有两种分类:索引别名、字段别名
1. 索引别名
别名可以 映射/指向 到 一个或多个索引,并且可以在任何需要索引名称的API中使用。为了在不停服务的情况下增加容量,实现零停机,使用索引别名是一个很好的解决方案。
- 创建一个新的索引存储新的数据
- 同时搜索两个索引来获取新数据和旧数据
使用别名的话,对于查询系统而言,添加一个新索引 或 切换索引,是毫无感觉的。不过注意:别名不能与索引的名字一样。
1.1. 效率
使用别名的效率和直接索引效率一样吗?
它们的效率是一致的。前提是,别名和索引都指向相同的数据。因为,索引别名只是 物理索引的软连接而已。
1.2. 示例
创建几个名字差不多的索引,my_index_1/my_index_2
1 | PUT /my_index_1 |
设置索引别名:my_index,并指向my_index_1/my_index_2
1 | PUT /my_index_1/_alias/my_index |
通过 elasticsearch-head工具可以看到,索引名字下已经标注别名。
查看my_index别名,指向了哪些索引
1 | GET /*/_alias/my_index |
返回结果
1 | { |
查看my_index_1索引,指向了哪些别名
1 | GET /my_index_1/_alias/* |
返回结果
1 | { |
1.3. 官方示例
添加索引到别名
1 | POST /_aliases |
同时添加多个
1 | POST /_aliases |
删除别名下的索引
1 | POST /_aliases |
新增和删除可以一起
1 | POST /_aliases |
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别名中移除。
创建新的索引 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
51PUT /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"
}
}
}
}
}将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
29POST /_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 | GET /test_alias/_search |
1.6. 注意
索引的别名不是所有地方都通用,写数据的时候,需要指明物理索引的名字,不要向别名写数据。
2. 字段别名
字段别名是6.4+版本才有的字段类型。
暂时放着…