Elasticsearch Indices APIs 索引別名

翻譯自官網, 水平有限,用于自查。轉載請注明網址: http://www.lxweimin.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/*
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,368評論 25 708
  • 刪除索引 用以下的請求來 刪除索引: 對一些人來說,能夠用單個命令來刪除所有數據可能會導致可怕的后果。如果你想要避...
    techhow閱讀 1,097評論 0 1
  • 支出:5 晚上停水,明天辦公室停電,停電干嘛上班嘛!電腦不能用,大家坐在辦公室干瞪眼嘛! 梅雨天要來了,抽濕器用起來哦!
    沒錯我就是那個帥小伙閱讀 180評論 1 0
  • 2017年11月15日追記: 11月11日在校長信箱發了一份《學生關于蘭州大學榆中校區應急疏散等安全問題的幾個關心...
    魔法密林港閱讀 2,257評論 9 5