美文网首页
Elasticsearch Indices APIs 索引别名

Elasticsearch Indices APIs 索引别名

作者: 朱柏霖 | 来源:发表于2017-06-12 16:18 被阅读0次

    翻译自官网, 水平有限,用于自查。转载请注明网址: http://www.jianshu.com/p/2fcd45128405

    索引别名

    Elasticsearch的api在处理指定索引时接受索引名称, 并可能接受多个索引。索引别名API允许为索引提供一个别名。 所有API自动将别名切换到实际的索引名称。 一个别名可以映射到多个索引, 当指定它时, 别名会自动扩展到别名索引。 一个别名也可以与一个过滤器相关联, 这个过滤器在搜索和路由的时候被自动应用。 别名不能具有与索引相同的名称。

    这里有一个将别名alias1和索引test建立联系的例子:

    POST /_aliases
    {
        "actions" : [
            { "add" : { "index" : "test1", "alias" : "alias1" } }
        ]
    }
    

    移除这个别名:

    POST /_aliases
    {
        "actions" : [
            { "remove" : { "index" : "test1", "alias" : "alias1" } }
        ]
    }
    

    重命名一个别名使用相同的API, 是一个简单的删除再添加的操作。 这是一个原子操作, 不需要担心在一个短时间内别名无法指向索引。

    POST /_aliases
    {
        "actions" : [
            { "remove" : { "index" : "test1", "alias" : "alias1" } },
            { "add" : { "index" : "test2", "alias" : "alias1" } }
        ]
    }
    

    将一个别名和多个索引建立联系,简单地应用多个add动作:

    POST /_aliases
    {
        "actions" : [
            { "add" : { "index" : "test1", "alias" : "alias1" } },
            { "add" : { "index" : "test2", "alias" : "alias1" } }
        ]
    }
    

    多个索引可以通过一个带有索引数组语法的操作指定:

    POST /_aliases
    {
        "actions" : [
            { "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }
        ]
    }
    

    通过相应的aliases数组语法, 可以在一个动作中指定多个别名。
    对于上面的例子, 也可以使用glob pattern建立一个别名到多个索引的联系 :

    POST /_aliases
    {
        "actions" : [
            { "add" : { "index" : "test*", "alias" : "all_test_indices" } }
        ]
    }
    

    在这个例子中, 别名是一个时间点别名, 将对所有当前匹配的索引进行分组, 当匹配该模式的新索引被添加或删除时, 它不会自动更新。

    索引到一个指向多索引的别名是一个错误的操作。

    可以在一个操作中用别名交换索引:

    PUT test                   //1 
    PUT test_2               //2
    POST /_aliases
    {
    "actions" : [
    { "add": { "index": "test_2", "alias": "test" } },
    { "remove_index": { "index": "test" } }  //3
    ]
    }
    
    1. 一个我们错误创建的索引
    2. 我们应该添加的索引
    3. remove_index 同 Delete Index

    过滤的别名

    带有过滤器的别名提供了创建相同索引不同“视图”的简便方法。 可以使用查询DSL定义过滤器, 并将其应用于所有搜索、计数、删除查询以及类似的使用别名的操作。

    要建立一个过滤的别名, 首先我们要确定映射中的字段已存在:

    PUT /test1
    {
      "mappings": {
        "type1": {
          "properties": {
            "user" : {
              "type": "keyword"
            }
          }
        }
      }
    }
    

    现在我们可以使用一个user的过滤器来建立一个别名:

    POST /_aliases
    {
        "actions" : [
            {
                "add" : {
                     "index" : "test1",
                     "alias" : "alias2",
                     "filter" : { "term" : { "user" : "kimchy" } }
                }
            }
        ]
    }
    

    路由

    可以将路由和别名关联起来。 这个特性可以与过滤的别名一起使用, 以避免不必要的分片操作。

    如下命令建立一个新别名alias1, 指向索引test。 在alias1创建后, 所有对这个别名的操作自动修改为使用值 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"
                }
            }
        ]
    }
    

    如上例所示, 搜索路由可能包含多个逗号分隔的值。 索引路由只能包含一个单值。

    如果一个搜索操作使用了路由别名并且有一个路由参数, 则使用别名中搜索路由和参数指定的路由的交集。 例如, 以下命令将使用“2”作为路由值:

    GET /alias2/_search?q=user:kimchy&routing=2,3
    

    如果一个索引操作使用索引路由别名并且有一个父路由( parent routing ), 父路由会被忽略。

    添加一个单独的别名

    一个别名也可以通过如下端点添加:

    PUT /{index}/_alias/{name}
    

    其中:

    参数 含义
    index 别名指向的索引, 可以是任意的:* ¦ _all ¦ glob pattern ¦ name1, name2, …
    name 别名的名称, 这是必须得参数。
    routing 可选的关联别名的路由
    filter 可选的关联别名的过滤器

    你也可以使用复数的_aliases。

    例子:

    增加基于时间的别名:

    PUT /logs_201305/_alias/2013
    

    增加基于用户的别名:

    先建立索引, 增加user_id字段的映射
    PUT /users
    {
        "mappings" : {
            "user" : {
                "properties" : {
                    "user_id" : {"type" : "integer"}
                }
            }
        }
    }
    
    为指定的用户添加别名
    PUT /users/_alias/user_12
    {
        "routing" : "12",
        "filter" : {
            "term" : {
                "user_id" : 12
            }
        }
    }
    

    索引建立过程中的别名

    别名还可以在创建索引的过程中指定:

    PUT /logs_20162801
    {
        "mappings" : {
            "type" : {
                "properties" : {
                    "year" : {"type" : "integer"}
                }
            }
        },
        "aliases" : {
            "current_day" : {},
            "2016" : {
                "filter" : {
                    "term" : {"year" : 2016 }
                }
            }
        }
    }
    

    删除别名

    REST端点:http /{index}/_alias/{name}
    其中:

    参数 含义
    index * ¦ _all ¦ glob pattern ¦ name1, name2, …
    name * ¦ _all ¦ glob pattern ¦ name1, name2, …

    或者可使用复数的别名:

    DELETE /logs_20162801/_alias/current_day
    

    获取存在的别名

    获取索引别名的API支持通过别名名称和索引名称筛选。 该api重定向到主节点并获取所有请求的索引别名, 如果其可用。 这个api只序列化被发现的索引别名。

    可用选项:

    参数 含义
    index 用于获取别名的索引名。部分名称支持通配符, 也可以使用逗号分隔的多个索引名。也可以使用索引的别名
    alias 响应中返回的别名的名称。 和index选项相同, 这个选项支持通配符且可以使用逗号分隔的多个别名名称
    ignore_unavailable 如果指定的索引名不存在, 设置为true会忽略这些索引。

    REST端点:http /{index}/_alias/{alias}

    例子

    索引的所有别名:

    GET /logs_20162801/_alias/*
    

    响应:

    {
     "logs_20162801" : {
       "aliases" : {
         "2016" : {
           "filter" : {
             "term" : {
               "year" : 2016
             }
           }
         }
       }
     }
    }
    

    所有名称是2016的别名:

    GET /_alias/2016
    

    响应:

    {
      "logs_20162801" : {
        "aliases" : {
          "2016" : {
            "filter" : {
              "term" : {
                "year" : 2016
              }
            }
          }
        }
      }
    }
    

    所有名称由20开始的别名:

    GET /_alias/20*
    

    响应:

    {
      "logs_20162801" : {
        "aliases" : {
          "2016" : {
            "filter" : {
              "term" : {
                "year" : 2016
              }
            }
          }
        }
      }
    }
    

    还有一个获取索引别名api的头部变体, 以检查是否存在索引别名。 索引别名和获取索引别名有着相同的选项。 例如:

    HEAD /_alias/2016
    HEAD /_alias/20*
    HEAD /logs_20162801/_alias/*
    

    相关文章

      网友评论

          本文标题:Elasticsearch Indices APIs 索引别名

          本文链接:https://www.haomeiwen.com/subject/qbdlqxtx.html