Elasticsearch 索引别名应用
Elasticsearch支持给索引增加别名,即可以给一个或多个索引增加一个别名。后续查询自动转换别名为实际索引名称。别名也可以和过滤器一起使用实现类似与视图功能,也可以定义路由别名避免不必要的共享操作。
1. 语法
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "my-index-000001", "alias" : "alias1" } }
]
}
action : 数组类型,指定一组动作。包括 add 、remove、remove_index等。
这些动作需要定义别名对象,别名对象包括参数有:
index :指定索引(可以使用通配符),在索引上执行动作。如果 indices没有指定则该参数为必须。
indices:指定一组索引,如果index没有指定则indices参数必须指定。
alias 和 aliases :字符串类型指定别名,支持逗号分割指定多个; aliases是数组类型。
其他参数可参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html。
2. 别名API
2.1 增加别名
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } }
]
}
test1 索引增加 alias1 别名。
2.2 删除别名
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } }
]
}
删除别名alias1。
2.3 重命名别名
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test1", "alias" : "alias2" } }
]
}
重命名是先删除再增加。该操作是原子的,无需担心在很短的时间内丢失别名。
2.4 给多个索引增加别名
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test1", "alias" : "alias1" } },
{ "add" : { "index" : "test2", "alias" : "alias1" } }
]
}
也可以使用索引数组实现:
POST /_aliases
{
"actions" : [
{ "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }
]
}
上面示例也可以通过通配符实现:
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test*", "alias" : "all_test_indices" } }
]
}
需要提醒的是,上面API只在执行时起作用。后续增加或删除满足条件的索引不会自动更新。
2.5 别名交换
PUT test
PUT test_2
POST /_aliases
{
"actions" : [
{ "add": { "index": "test_2", "alias": "test" } },
{ "remove_index": { "index": "test" } }
]
}
Elasticsearch 也支持采用原子操作方式实现索引别名交换,这意味着不会出现集群中某时刻别名不存在情况。但由于索引和搜索涉及多个步骤,正在处理的或排队的请求可能会由于临时不存在的索引而失败。
上面示例,如果单独执行必须先删除,这里一次性执行成功。
3. 别名应用
3.1 过滤别名实现视图功能
过滤别名提供简单方式创建索引视图。过滤通过Query DSL定义搜索、计数等操作。创建过滤别名,首先需确保过滤字段必须存在:
PUT /my-index-000001
{
"mappings": {
"properties": {
"user": {
"properties": {
"id": {
"type": "keyword"
}
}
}
}
}
}
这里创建了嵌套字段user.id,下面创建过滤别名:
POST /_aliases
{
"actions": [
{
"add": {
"index": "my-index-000001",
"alias": "alias2",
"filter": { "term": { "user.id": "kimchy" } }
}
}
]
}
该别名仅查询特定符合条件的文档。
3.2 路由别名
路由用于快速定位特定主分片,Elasticsearch支持路由别名,该功能可以和过滤别名一起使用避免必要的共享操作。
下面命令创建别名 alias1 指向 test。创建之后所有对该别名的操作自动修改路由值为 1:
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias1",
"routing": "1"
}
}
]
}
路由别名也支持对搜索和索引操作指定不同路由值:
POST /_aliases
{
"actions": [
{
"add": {
"index": "test",
"alias": "alias2",
"search_routing": "1,2",
"index_routing": "2"
}
}
]
}
4. 总结
本文介绍了Elasticsearch别名功能,通过定义过滤别名实现视图功能,路由别名简化路由操作。