Elasticsearch 2.3.0 索引别名

*爱你&永不变心* 提交于 2019-12-07 15:15:45

别名管理

    在Elasticsearch所有的API中,对应的是一个或者多个索引。Elasticsearch可以对一个或者多个索引指定别名,通过别名可以查询到一个或者多个索引的内容,在内部,Elasticsearch会自动把别名映射到响应的索引上。可以对别名编写过滤器或者路由,在系统中别名不能重复,也不能和索引名重复。其实在Elasticsearch的别名机制有点像数据库中的视图。例如:把索引test1增加一个别名alias1。

请求:POST 'http://localhost:9200/_aliases

参数:

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

删除别名:

请求是一样的,参数不一样。

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

注意:别名没有修改的语法,当需要修改别名的时候,可以先删除别名,然后再增加别名,例如:

{
    "actions" : [
        { "remove" : { "index" : "test1", "alias" : "alias1" } },
        { "add" : { "index" : "test1", "alias" : "alias2" } }
    ]
}

一个别名关联多个索引:

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

或者用下面的语法:

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

或者使用通配符:

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

注意:通配符指定的索引只是在当前生效,后面添加的索引不会被自动添加到别名上。

对一个别名做索引的时候,如果别名关联多个索引的时候会报错。

过滤索引别名

    通过过滤索引来指定别名提供了对索引查看的不同视图,该过滤器可以使用查询DSL定义适用于所有的搜索,计数,删除查询,这样的操作与此别名。

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

创建一个索引,请求:PUT http://localhost:9200/test1

参数

{
  "mappings": {
    "type1": {
      "properties": {
        "user" : {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}

创建过滤别名,请求:POST  http://localhost:9200/_aliases

参数:

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

通过别名也可以和路由关联,此功能可以和过滤别名命令一起使用,以避免不必要的碎片操作。例如:

请求:POST 'http://localhost:9200/_aliases

参数:

{
    "actions" : [
        {
            "add" : {
                 "index" : "test",
                 "alias" : "alias1",
                 "routing" : "1"
            }
        }
    ]
}

同时可以指定搜索路由或者查询路由,例如参数:

{
    "actions" : [
        {
            "add" : {
                 "index" : "test",
                 "alias" : "alias2",
                 "search_routing" : "1,2",
                 "index_routing" : "2"
            }
        }
    ]
}

注意:搜索路由可以指定多个值,索引路由只能指定一个值。如果使用路由别名的操作同时还有路由参数,则结果是别名路由和路由的交集。例如以下命令将使用“2”作为路由值:

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

通过参数添加别名

语法:PUT /{index}/_alias/{name}

条件解释:

index:参照的索引,可以使用 * , _all ,正则表达式或者逗号分开的多个name1, name2, …

name:别名的名称。

routing:别名对应的路由。

filter:指定别名时候的过滤条件。

例如:PUT localhost:9200/logs_201305/_alias/2013

例如一个索引。

PUT 'localhost:9200/users' -d '{
    "mappings" : {
        "user" : {
            "properties" : {
                "user_id" : {"type" : "integer"}
            }
        }
    }
}

指定别名:

PUT 'localhost:9200/users/_alias/user_12' -d '{
    "routing" : "12",
    "filter" : {
        "term" : {
            "user_id" : 12
        }
    }
}

建索引的时候同时指定别名

例如:

PUT localhost:9200/logs_20142801 -d '{
    "mappings" : {
        "type" : {
            "properties" : {
                "year" : {"type" : "integer"}
            }
        }
    },
    "aliases" : {
        "current_day" : {},
        "2014" : {
            "filter" : {
                "term" : {"year" : 2014 }
            }
        }
    }
}

删除别名

语法:DELETE  /{index}/_alias/{name}

例如:DELETE localhost:9200/users/_alias/user_12

查询现有的别名

可以通过索引名或者别名进行查询。参数:

index:索引别名的名称。部分名称支持通配符,用逗号分隔也可以指定多个索引名称,还可以使用索引的别名名称。

alias:在响应中返回的别名名称。 该参数支持通配符和用逗号分隔的指定多个别名。

ignore_unavailable:如果一个指定的索引名称不存在该怎么办。如果设置为true,那么这些索引将被忽略。

语法:GET /{index}/_alias/{alias}

例如:GET localhost:9200/users/_alias/*

返回值:

{
  "users" : {
    "aliases" : {
      "user_13" : {
        "filter" : {
          "term" : {
            "user_id" : 13
          }
        },
        "index_routing" : "13",
        "search_routing" : "13"
      },
      "user_14" : {
        "filter" : {
          "term" : {
            "user_id" : 14
          }
        },
        "index_routing" : "14",
        "search_routing" : "14"
      },
      "user_12" : {
        "filter" : {
          "term" : {
            "user_id" : 12
          }
        },
        "index_routing" : "12",
        "search_routing" : "12"
      }
    }
  }
}

下面的例子中包括所有别名为2013的。

GET localhost:9200/_alias/2013

返回:

{
  "logs_201304" : {
    "aliases" : {
      "2013" : { }
    }
  },
  "logs_201305" : {
    "aliases" : {
      "2013" : { }
    }
  }
}

GET localhost:9200/_alias/2013_01*

返回:

{
  "logs_20130101" : {
    "aliases" : {
      "2013_01" : { }
    }
  }
}

用HEAD也可以检查别名是否存在,语法和GET类似,例如:

curl -XHEAD -i 'localhost:9200/_alias/2013'

curl -XHEAD -i 'localhost:9200/_alias/2013_01*'

curl -XHEAD -i 'localhost:9200/users/_alias/*'

    赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!