Skip to main content
 首页 » 编程设计

Elasticsearch 索引别名应用

2022年07月19日110lyhabc

Elasticsearch 索引别名应用

Elasticsearch支持给索引增加别名,即可以给一个或多个索引增加一个别名。后续查询自动转换别名为实际索引名称。别名也可以和过滤器一起使用实现类似与视图功能,也可以定义路由别名避免不必要的共享操作。

1. 语法

POST /_aliases 
{
    
  "actions" : [ 
    {
    "add" : {
    "index" : "my-index-000001", "alias" : "alias1" } } 
  ] 
} 

action : 数组类型,指定一组动作。包括 add 、remove、remove_index等。

这些动作需要定义别名对象,别名对象包括参数有:

index :指定索引(可以使用通配符),在索引上执行动作。如果 indices没有指定则该参数为必须。

indices:指定一组索引,如果index没有指定则indices参数必须指定。

alias 和 aliases :字符串类型指定别名,支持逗号分割指定多个; aliases是数组类型。

其他参数可参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html。

2. 别名API

2.1 增加别名

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

test1 索引增加 alias1 别名。

2.2 删除别名

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

删除别名alias1。

2.3 重命名别名

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

重命名是先删除再增加。该操作是原子的,无需担心在很短的时间内丢失别名。

2.4 给多个索引增加别名

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

也可以使用索引数组实现:

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

上面示例也可以通过通配符实现:

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

需要提醒的是,上面API只在执行时起作用。后续增加或删除满足条件的索引不会自动更新。

2.5 别名交换

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

Elasticsearch 也支持采用原子操作方式实现索引别名交换,这意味着不会出现集群中某时刻别名不存在情况。但由于索引和搜索涉及多个步骤,正在处理的或排队的请求可能会由于临时不存在的索引而失败。

上面示例,如果单独执行必须先删除,这里一次性执行成功。

3. 别名应用

3.1 过滤别名实现视图功能

过滤别名提供简单方式创建索引视图。过滤通过Query DSL定义搜索、计数等操作。创建过滤别名,首先需确保过滤字段必须存在:

PUT /my-index-000001 
{
    
  "mappings": {
    
    "properties": {
    
      "user": {
    
        "properties": {
    
          "id": {
    
            "type": "keyword" 
          } 
        } 
      } 
    } 
  } 
} 

这里创建了嵌套字段user.id,下面创建过滤别名:

POST /_aliases 
{
    
  "actions": [ 
    {
    
      "add": {
    
        "index": "my-index-000001", 
        "alias": "alias2", 
        "filter": {
    "term": {
    "user.id": "kimchy" } } 
      } 
    } 
  ] 
} 

该别名仅查询特定符合条件的文档。

3.2 路由别名

路由用于快速定位特定主分片,Elasticsearch支持路由别名,该功能可以和过滤别名一起使用避免必要的共享操作。

下面命令创建别名 alias1 指向 test。创建之后所有对该别名的操作自动修改路由值为 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" 
      } 
    } 
  ] 
} 

4. 总结

本文介绍了Elasticsearch别名功能,通过定义过滤别名实现视图功能,路由别名简化路由操作。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/108798251
阅读延展