前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch使用:Alias API

Elasticsearch使用:Alias API

作者头像
HLee
修改2021-01-15 11:43:49
9480
修改2021-01-15 11:43:49
举报
文章被收录于专栏:房东的猫

简介

你可能想知道别名究竟是什么,以及 Elasticsearch 在创建别名时涉及何种开销。 别名将其生命置于集群状态内,由主节点(master node) 管理; 这意味着如果你有一个名为 idaho 的别名指向一个名为 potato 的索引,那么开销就是集群状态映射中的一个额外键,它将名称 idaho 映射到具体的索引字符串。 这意味着与其他指数相比,别名的重量要轻得多; 可以维护数千个而不会对集群产生负面影响。

Alias

为了验证我们的 API,我们先建立一些数据:

代码语言:javascript
复制
PUT twitter/_doc/1
{
  "user": "双榆树-张三",
  "message": "今儿天气不错啊,出去转转去",
  "uid": 2,
  "age": 20,
  "city": "北京",
  "province": "北京",
  "country": "中国",
  "address": "中国北京市海淀区",
  "location": {
    "lat": "39.970718",
    "lon": "116.325747"
  }
} 
PUT twitter/_doc/2
{
  "user": "东城区-老刘",
  "message": "出发,下一站云南!",
  "uid": 3,
  "age": 30,
  "city": "北京",
  "province": "北京",
  "country": "中国",
  "address": "中国北京市东城区台基厂三条3号",
  "location": {
    "lat": "39.904313",
    "lon": "116.412754"
  }
} 
PUT twitter/_doc/3
{
  "user": "虹桥-老吴",
  "message": "好友来了都今天我生日,好友来了,什么 birthday happy 就成!",
  "uid": 7,
  "age": 90,
  "city": "上海",
  "province": "上海",
  "country": "中国",
  "address": "中国上海市闵行区",
  "location": {
    "lat": "31.175927",
    "lon": "121.383328"
  }
}

这样,我们建立了三个文档的 twitter 索引。

管理别名

请求的格式:

代码语言:javascript
复制
PUT /<index>/_alias/<alias>
POST /<index>/_alias/<alias>
PUT /<index>/_aliases/<alias>
POST /<index>/_aliases/<alias>

路径参数:

  • <index> : 要添加到别名的索引名称的逗号分隔列表或通配符表达式。要将群集中的所有索引添加到别名,请使用_all值。
  • <alias>:  (必需,字符串)要创建或更新的索引别名的名称。

一个index别名就是一个用来引用一个或多个已经存在的索引的另外一个名字,我们可以用如下的方法来创建

代码语言:javascript
复制
PUT /twitter/_alias/alias1

比如经过上面的 REST 请求,我们为 twitter 创建了另外一个别名 alias1。我们以后可以通过alias1来访问这个index:

代码语言:javascript
复制
GET alias1/_search

结果:
{
  "took" : 53,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "user" : "虹桥-老吴",
          "message" : "好友来了都今天我生日,好友来了,什么 birthday happy 就成!",
          "uid" : 7,
          "age" : 90,
          "city" : "上海",
          "province" : "上海",
          "country" : "中国",
          "address" : "中国上海市闵行区",
          "location" : {
            "lat" : "31.175927",
            "lon" : "121.383328"
          }
        }
      },
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "user" : "东城区-老刘",
          "message" : "出发,下一站云南!",
          "uid" : 3,
          "age" : 30,
          "city" : "北京",
          "province" : "北京",
          "country" : "中国",
          "address" : "中国北京市东城区台基厂三条3号",
          "location" : {
            "lat" : "39.904313",
            "lon" : "116.412754"
          }
        }
      },
      {
        "_index" : "twitter",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "user" : "双榆树-张三",
          "message" : "今儿天气不错啊,出去转转去",
          "uid" : 2,
          "age" : 20,
          "city" : "北京",
          "province" : "北京",
          "country" : "中国",
          "address" : "中国北京市海淀区",
          "location" : {
            "lat" : "39.970718",
            "lon" : "116.325747"
          }
        }
      }
    ]
  }
}

显然这样做的好处是非常明显的,我们可以把我们想要的进行搜索的 index 取一个和我们搜索方法里一样的别名就可以了,这样我们可以不修改我们的搜索方法,就可以分别对不同的 index 进行搜索。比如我们可以用同样的搜索方法对每天的 log 进行分析。只有把每天的 log 的 index 的名字都改成一样的 alias 就可以了。

创建一个基于城市的alias:

代码语言:javascript
复制
PUT twitter/_alias/city_beijing
{
  "filter": {
    "term": {
      "city": "北京"
    }
  }
}

在这里,我们创建了一个名称为 city_beijing 的 alias。如果我们运行如下的搜索:

代码语言:javascript
复制
GET city_beijing/_search

alias 也可以在创建 index 时被创建,比如:

代码语言:javascript
复制
DELETE twitter 
PUT twitter
{
  "mappings": {"_doc":{
    "properties": {
      "address": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "age": {
        "type": "long"
      },
      "city": {
        "type": "keyword",
        "copy_to": [
          "region"
        ]
      },
      "country": {
        "type": "keyword",
        "copy_to": [
          "region"
        ]
      },
      "explain": {
        "type": "boolean"
      },
      "location": {
        "type": "geo_point"
      },
      "message": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "province": {
        "type": "keyword",
        "copy_to": [
          "region"
        ]
      },
      "region": {
        "type": "text"
      },
      "uid": {
        "type": "long"
      },
      "user": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }}
    }
  },
  "aliases": {
    "city_beijing": {
      "filter": {
        "term": {
          "city": "北京"
        }
      }
    }
  }
}

获取 alias

我们可以通过如下的 API 来获取当前以及定义好的 alias:

代码语言:javascript
复制
GET /_alias
GET /_alias/<alias>
GET /<index>/_alias/<alias>

比如:
GET /twitter/_alias/alias1

这里获取在 twitter 下的名字叫做 alias1 的别名。针对我们的情况,我们使用如下的接口:

代码语言:javascript
复制
GET /twitter/_alias/city_beijing

结果:
{
    "twitter":{
        "aliases":{
            "city_beijing":{
                "filter":{
                    "term":{
                        "city":"北京"
                    }
                }
            }
        }
    }
}

你也可以通过如下的 通配符方式来获取所有的 alias:

代码语言:javascript
复制
GET /twitter/_alias/*

比如,我们新增加一个 alias1 的别名:

代码语言:javascript
复制
PUT /twitter/_alias/alias1

上面的通配符方式返回来得结果为:

代码语言:javascript
复制
{
    "twitter":{
        "aliases":{
            "alias1":{

            },
            "city_beijing":{
                "filter":{
                    "term":{
                        "city":"北京"
                    }
                }
            }
        }
    }
}

显然这里有两个别名:alias1 及 city_beijing。

检查alias

我们可以通过如下的方式来检查一个alias是否存在:

代码语言:javascript
复制
HEAD /_alias/<alias>
HEAD /<index>/_alias/<alias>

比如:
HEAD /_alias/alias1

结果:200 - OK

同样你也可通过通配符方式来查询:

代码语言:javascript
复制
HEAD /_alias/city*

更新 alias

代码语言:javascript
复制
POST /_aliases
代码语言:javascript
复制
#添加别名
POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "sphinx-diseasehospital-20.11.30-161133",
        "alias": "sphinx-diseasehospital"
      }
    }
  ]
}
#删除别名
POST /_aliases 
{
    "actions": [{
        "remove": {
            "index": "drug-20.12.02-150616",
            "alias": "teamHot"
        }
    }]
}
#切换别名
POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "drug-21.01.06-183405",
        "alias": "drug"
      }
    },
    {
      "add": {
        "index": "drug-21.01.04-101537",
        "alias": "drug"
      }
    }
  ]
}
注:重命名别名是一个简单的删除然后在同一 API 中添加操作。 此操作是原子操作,无需担心别名未指向索引的短时间段

在 action 里,我们可以有如下的几种:

  • add: 添加一个别名
  • remove: 删除一个别名
  • remove_index: 删除一个index或它的别名

alias多索引

将别名与多个索引相关联只需几个添加操作:

代码语言:javascript
复制
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test1",
        "alias": "alias1"
      }
    },
    {
      "add": {
        "index": "test2",
        "alias": "alias1"
      }
    }
  ]
}

你也可以通过如下的方式,通过一个add命令来完成:

代码语言:javascript
复制
POST /_aliases
{
  "actions": [
    {
      "add": {
        "indices": [
          "test1",
          "test2"
        ],
        "alias": "alias1"
      }
    }
  ]
}
或是
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test*",
        "alias": "all_test_indices"
      }
    }
  ]
}

这样所有以 test* 为开头的索引都共同一个别名。

当我们 index 我们的文档时,对一个指向多个 index 的别名进行索引是错误的。

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

代码语言:javascript
复制
PUT test     
PUT test_2 

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test_2",
        "alias": "test"
      }
    },
    {
      "remove_index": {
        "index": "test"
      }
    }
  ]
}

在上面的例子中,假如我们地添加了一个叫做 test 的 index,而 test_2 是我们想要的。我们直接可以通过上面的方法把test中的数据交换到 test_2 中,并同时把 test 索引删除。

Filtered alias

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

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

代码语言:javascript
复制
PUT /test1
{
  "mappings": {
    "_doc": {
      "properties": {
        "user": {
          "type": "keyword"
        }
      }
    }
  }
}

现在我们可以利用 filter 来创建一个alias,是基于 user 字段

代码语言:javascript
复制
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test1",
        "alias": "alias2",
        "filter": {
          "term": {
            "user": "kimchy"
          }
        }
      }
    }
  ]
}

上面的 alias2 创建了一个 test1 索引上的一个 filter,包含所有的 user 为 kimchy 的文档。

Write index

可以将别名指向的索引关联为 write 索引。 指定后,针对指向多个索引的别名的所有索引和更新请求将尝试解析为 write 索引的一个索引。 每个别名只能将一个索引分配为一次 write 索引。 如果未指定 write 索引且别名引用了多个索引,则不允许写入。

可以使用别名API和索引创建API将与别名关联的索引指定为write索引。

代码语言:javascript
复制
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test",
        "alias": "alias1",
        "is_write_index": true
      }
    },
    {
      "add": {
        "index": "test2",
        "alias": "alias1"
      }
    }
  ]
}

在这里,我们定义了 alias1 同时指向 test 及 test2 两个索引。其中 test 中,注明了 is_write_index,那么,如下的操作

代码语言:javascript
复制
PUT /alias1/_doc/1
{
  "foo": "bar"
}

相当于如下的操作:PUT /test/_doc/1

也就是写入到 test 索引中,而不会写入到 test2 中。

要交换哪个索引是别名的写入索引,可以利用别名 API 进行原子交换。 交换不依赖于操作的顺序。

代码语言:javascript
复制
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test",
        "alias": "alias1",
        "is_write_index": false
      }
    },
    {
      "add": {
        "index": "test2",
        "alias": "alias1",
        "is_write_index": true
      }
    }
  ]
}

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-aliases.html

【2】https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-get-alias.html

【3】https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-add-alias.html

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Alias
    • 管理别名
      • 获取 alias
        • 检查alias
          • 更新 alias
            • alias多索引
              • Filtered alias
                • Write index
                相关产品与服务
                Elasticsearch Service
                腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档