目录
Elasticsearch 1: 基本原理和概念
Elasticsearch 2: 管理索引和文档
Elasticsearch 3: 数据检索和分析
Elasticsearch 4: 相关性检索和组合查询
Elasticsearch 5: 聚集查询
Elasticsearch 6: 索引别名
Elasticsearch 集群
SpringBoot 整合 Elasticsearch
别名,有点类似数据库的视图,别名一般都会和一些过滤条件相结合,可以做到即使是同一个索引上,让不同人看到不同的数据。别名的访问接口是_alias。
1. 创建索引添加别名
PUT /index_alias
{
"aliases": {
"index1": {
"filter": {
"term": {
"name": "Apache"
}
}
}
}
}
2. 为已有索引添加别名
- 查看已存在的索引
GET /_cat/indices?v
put /myindex/_alias/myindex-alias
{
"filter": {
"match": {
"content": "Java8"
}
}
}
3. 查询指定索引的别名
get /myindex/_alias
4. 删除别名
delete /myindex/_alias/myindex-alias
5. 查询别名
get _cat/aliases
get 索引名/_alias,看索引所有的别名,如:GET /myindex/_alias
get 别名,看别名关联索引的详情,如: GET myindex-alias
6. 通过别名查询
GET myindex-alias/_search
7. _aliases 接口
- 同时_aliases 接口可以做批量操作,比如通过_aliases 接口将一个别名关联多个索引:
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index_1",
"alias": "my_index_alias"
}
},
{
"add": {
"index": "my_index_2",
"alias": "my_index_alias"
}
}
]
}
- 或者对于同一个 index,我们给不同人看到不同的数据,如 my_index 有个字段是 team,team 字段记录了该数据是那个 team 的。team 之间的数据是不可见的。
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index_teamA_alias",
"filter": {
"term": {
"team": "teamA"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index_teamB_alias",
"filter": {
"term": {
"team": "teamB"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index_team_alias"
}
}
]
}
- 只要有可能,尽量使用别名,推荐为 Elasticsearch 的每个索引都使用别名,因为在未来重建索引的时候,别名会赋予你更多的灵活性。假设一开始创建的索引只有一个主分片,之后你又决定为索引扩容。如果为原有的索引使用的是别名, 现在你可以修改别名让其指向额外创建的新索引,而无须修改被搜索的索引名称(假设一开始你就为搜索使用了别名)。
- 另一个有用的特性是,在不同的索引中创建窗口。比如,如果为数据创建了每日索引,你可能期望一个滑动窗口涵盖过去一周的数据,别名就称为 last-7-days。 然后,每天创建新的每日索引时,你可以将其加入别名,同时停用或者删除第 8 天前的旧索引。
- 别名还能提供另一个特性,那就是路由。
8. 结合路由和别名
- 别名是对索引的抽象,非常灵活。 假设别名指向一个单独的索引,那么它们也可以和路由一起使用,在查询或索引的时候自动地使用路由值。如
POST /_aliases
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index_alias",
"filter": {
"match": {
"content": "Java8"
}
},
"routing": "AKey"
}
},
{
"add": {
"index": "my_index",
"alias": "my_index_alias2",
"filter": {
"match": {
"content": "Java11"
}
},
"routing": "BKey"
}
}
]
}
- 或者
PUT /myindex/_alias/myindex-alias3
{
"filter": {
"match": {
"content": "Java16"
}
},
"routing": "CKey"
}
9. _rollover 接口
- _rollover 接口用于根据一系列条件将别名指向一个新的索引,这些条件包括存续时间、文档数量和存储容量等。这与日志文件使用的文件滚动类似,文件滚动是通过不断创建新文件并滚动旧文件来保证日志文件不会过于庞大,而_rollover 接口则是通过不断将别名指向新的索引以保证索引容量不会过大。但这种别名滚动并不会自动完成,需要主动调用_rollover 接口。
- 别名滚动的条件可通过 conditions 参数设置,包括 max_age、 max_docs 和 max_size 等三个子参数。例如,创建一个索引 logs- 1 并分配别名 logs, 然后调用 logs 别名的_rollover 接口设置别名滚动条件,如:
PUT /logs-1
{
"aliases": {
"logs": {
}
}
}
- 调用_rollover接口
POST /logs/_rollover
{
"conditions": {
"max_age": "14d",
"max_docs": 10000,
"max_size": "4gb"
}
}
- 在示例中,logs 别名指向 logs-1 索引,最大存活周期为 14 天,最大文档数量 10000 条,最大存储容量 4GB。因为 logs-1 索引刚刚创建,存活时间、文档数量和存储容量都不满足条件,所以使用示例的请求不会对 logs 别名产生任何影响。这通过请求返回的结果也可以看到。
- 从返回结果的 conditions 属性来看,三个条件匹配的结果都是 false,所以不会触发索引滚动。如果想体验别名滚动的效果,可以将 max_age 设置为 1s 再调用上面的请求。之后通过
GET _cat/indices
接口就会发现有新的索引 logs-000002 产生,再分别查看这两个索引就会发现,logs-1 的别名已经被清空, 而 logs-000002 的别名中则已经添加了 logs。新索引的命名规则在原索引名称数字的基础上加 1,并且将数值长度补 0 凑足 6 位。
- logs-1的别名是空的,但是logs-000002的别名变成了logs,所以别名logs只会指向最新生成的索引
-
所以使用_rollover 接口时,要求索引名称必须以数字结尾,数字与前缀之间使用连接线“-”连接。
-
由于_rollover 接口在滚动新索引时,会将别名与原索引的关联取消,所以通过别名再想查找已经编入索引的文档就不可能了。为了保证原文档可检索,可以通过别名 is_write_index 参数保留索引与别名的关系。当使用 is_write_index 参数设置了哪一个索引为写索引时,_rollover 接口滚动别名指向索引时将不会取消别名与原索引之间的关系。它会将原索引的 is_write_index 参数设置为 false, 并将新索引的 is_write_index 参数设置为 true。
-
例如在创建 logs-4 时添加参数所示:
PUT /logs-4
{
"aliases": {
"logs4": {
"is_write_index": true
}
}
}
- 再执行示例中的请求时
POST /logs4/_rollover
{
"conditions": {
"max_age": "1s",
"max_docs": 10000,
"max_size": "4gb"
}
}
GET _cat/aliases?v
- 会发现 logs-4 的 is_write_index 参数被设置为 false,而新生成索引 logs-000005 的 is_write_index 参数则为 true。在两者的别名列表中都包含有 logs,可以继续通过 logs 别名对原索引进行查询。