Bootstrap

Elasticsearch索引别名的介绍和操作

ES版本 :1.4.1

  elasticsearch中的API可以接受一个对应于某个索引的索引名,也可以接受多个索引。索引别名API允许使用一个名字来作为一个索引的别名,所有的API会将别名转化成最终的索引名。一个也可以被映射到多于一个的索引上,当指定这个别名的时候,别名将会自动地扩展到别名的所有的索引上。一个别名也可以与一个过滤器建立关联,这个过滤器在搜索和路由值的时候自动被应用。

    
    这里有个例子,将别名alias1余索引test1建立关联:
    
    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test1", "alias": "alias1"}}
        ]
    }'
    
    一个别名也可以被移除,比如:
    
    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"remove": {"index": "test1", "alias": "alias1"}}
        ]
    }'
    
    重命名一个别名就是一个简单的remove然后add的操作,也是使用相同的API。这个操作是原子的,无需担心这个别名未能指向一个索引的简短时间:
    
    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"remove": {"index": "test1", "alias": "alias1"}},
            {"add": {"index":"test1", "alias": "alias2"}}
        ]
    }'
    
    将一个别名同多个的索引关联起来就是简单地几个add操作:
    
    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test1", "alias":"alias1"}},
            {"add": {"index": "test2", "alias":"alias1"}}
        ]
    }'
    
    向一个指向多个索引的别名去索引数据会引发一个错误。
    
    
    过滤的别名
    
    带有过滤器的别名提供了一种创建一个索引的不通的视图的简单方式。这个过滤器可以通过使用查询DSL来定义,并且能够通过使用这个别名将其应用于所有的搜索,计数,按照查询的删除操作,和更多类似的操作。
    
    1.4.0 beta1加入
    在别名过滤器中引用的字段必须在别名对应的index/indices上的mappings中存在。
    
    要创建一个过滤别名,首先我们需要确保这个字段已经在mapping中存在,如果索引已经存在,可以通过如下的方式将这个字段添加到mapping中:
    curl -XPUT 'http://localhost:9200/test1/_mappings/type1' -d '
    {
        "properties": {
            "user": {
                "type": "string",
                "index": "not_analyzed"
            }
        }
    }'
    
    现在我们可以使用user上的一个过滤器来创建一个别名了:
    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test1", "alias": "alias2", "filter": {"term": {"user": "kimchy"}}}}
        ]
    }'
    
    
    路由
    
    也可以将路由值与别名关联起来。这个特征可以与过滤别名结合使用以避免不必要的分片操作。
    
    下面的命令创建了一个新的别名alias1,这个别名指向索引test。alias1创建之后,所有通过这个别名的操作会自动的修改为使用值3来路由:
    curl -XPOST 'localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test", "alias": "alias3", "routing": "3"}}
        ]
    }'
    
    也可以为搜索和索引操作指定不通的路由值:
    
    curl -XPOST 'localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test", "alias": "alias3", "search_routing": "1,3", "index_routing":"3"}}
        ]
    }'
    
    如上的例子所示,搜索路由可能包含多个由都好分割的值。索引的路由只可以包含单个的值。
    
    如果一个使用路由别名的操作也有一个路由参数,将会使用别名路由和参数中指定的路由的交集。比如,如下的命令将会使用3作为路由值:
    curl -XGET 'http://localhost:9200/alias3/_search?q=user:kimchy&routing=3,4'
    
    增加单个的别名
    一个别名可以通过端点来添加。
    
    PUT /{index}/_alias/{name}
    
    其中
    index是这个别名所引用的索引。可以是空|*|_all|glob pattern|name1,name2,...
    name是别名的名字。这是一个必填项
    routing是同一个别名相关联的的路由,是可选的
    filter是同一个别名相关联的过滤器,是可选的
    
    你也可以使用个复数形式的_aliases。
    
    例子:
        添加一个基于时间的别名:
        curl -XPUT 'localhost:9200/logs_201305/_alias/2013'
        
        添加要给用户别名:
        首先要先创建这个索引,并且为user_id添加一个mapping:
        curl -XPUT 'localhost:9200/users' -d '{
            "mappings" : {
                "user" : {
                    "properties" : {
                        "user_id" : {"type" : "integer"}
                    }
                }
            }
        }'
        
        为某个用户添加一个别名:
        curl -XPOST 'localhost:9200/users/type1?routing=12' -d '
        {
            "user_id": 12,
            "name": "HelloKitty12num"
        }'
        
    索引创建时的别名
    
    别名也可以在索引创建的时候同时指定:
    curl -XPUT localhost:9200/logs_20142801 -d '{
        "mappings" : {
            "type" : {
                "properties" : {
                    "year" : {"type" : "integer"}
                }
            }
        },
        "aliases" : {
            "current_day" : {},
            "2014" : {
                "filter" : {
                    "term" : {"year" : 2014 }
                }
            }
        }
    }'
    
    删除别名
    
    rest端点是/{index}/_alias/{name}
    其中
    index: * | _all | glob pattern | name1, name2, …
    name: * | _all | glob pattern | name1, name2, …
    
    你也可以使用复数的_aliases。例子
    curl -XDELETE 'localhost:9200/users/_alias/user_12'
    
    获取已经存在的别名
    获取索引别名的API允许你通过过滤别名名称和索引名称。这个API会转到master并获取到请求的索引别名,如果可用的话。这个API只串行化找到的索引别名。
    
    可能的选项
    
    index 要获取别名的索引的名称。支持通配符,也支持通过使用逗号来指定的多个索引名。同时也可以是使用对应于一个索引的别名名称。
    alias 要返回的别名名称。类似于index选项,这个选项支持通配符和通过逗号分隔来指定多个别名名称。
    ignore_unavailable 如果一个索引名不存在怎么办。如果设置成true,这些索引会被忽略。
    
    rest端点是:/{index}/_alias/{alias}
    
    1.4.0.beta1加入
    这个API总会包含一个aliases部分,即使没有任何的别名。先前的版本不会返回aliaes部分。
    
    警告:对于未来版本的Elasticsearch,如果一个请求的索引不存在,默认的多索引选项将会出错。这样这个API就和其它的索引GET API看齐。
    
    例子:
        获取users索引的所有的别名:
        curl -XGET 'localhost:9200/users/_alias/*'
        
        应答:
        {
          "users" : {
            "aliases" : {
              "user_12" : {
                "filter" : {
                  "term" : {
                    "user_id" : 12
                  }
                },
                "index_routing" : "12",
                "search_routing" : "12"
              }
            }
          }
        }
        
        获取任意索引中,名为alias1的别名:
        curl -XGET 'localhost:9200/_alias/alias1?pretty' 
        
        应答:
        {
          "test2" : {
            "aliases" : {
              "alias1" : { }
            }
          },
          "test1" : {
            "aliases" : {
              "alias1" : { }
            }
          }
        }
        
        获取任意索引中的,以alias开头的所有的别名:
        curl -XGET 'localhost:9200/_alias/alias*?pretty'
        
        应答:
        {
          "test2" : {
            "aliases" : {
              "alias1" : { }
            }
          },
          "test1" : {
            "aliases" : {
              "alias2" : {
                "filter" : {
                  "term" : {
                    "user" : "kimchy"
                  }
                }
              },
              "alias1" : { }
            }
          },
          "test" : {
            "aliases" : {
              "alias3" : {
                "index_routing" : "3",
                "search_routing" : "3"
              }
            }
          }
        }
        
        也有获取索引别名API的HEAD变体,用来检测一个索引别名是否存在。它和获取索引API支持的索引相同。不过我的测试没有通过,故略过。
        
;