别名管理
在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公众号进行关注。
来源:oschina
链接:https://my.oschina.net/u/247205/blog/656198