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别名功能,通过定义过滤别名实现视图功能,路由别名简化路由操作。