Elasticsearch索引的基本操作(5)-別名設置

1、別名

Elasticsearch中的別名,可以分為索引別名、過濾器別名、路由別名等,不同的別名適用於不同的應用場景:

  • 索引別名就是給一個或幾個索引重新定義一個名字,操作索引別名時會轉化為對真實索引的操作,定義索引別名時不可以與真實的索引同名;
  • 過濾器別名提供了一種創建同一索引的不同“視圖”的簡便方法,可以使用Query DSL定義過濾器,並使用此別名將其應用於所有“搜索”,“計數”,“按查詢刪除”和“更多此類操作”;
  • 路由別名,將路由字段綁定到對應的別名,通過該別名操作時,會執行默認的路由規則,也可以理解為索引的另外一種“視圖”;

1.1、索引別名

索引別名,可以應用於以下場景:

  • 將正常運行集群中的索引遷移到另外一個索引,無須停機操作;
  • 將多個索引進行分組,以便於更好的管理;
  • 給索引創建類似於視圖的子集;

1.1.1、增加別名

給單個索引增加別名

為索引new_index定義別名new_index_alias,操作如下:

GET /new_index/_alias/new_index_alias

或執行如下操作:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index", "alias" : "new_index_alias" } }
]
}

給多個索引增加相同的別名

給索引new_index和new_index_2增加相同的別名new_index,操作如下:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "add" : { "index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

也可以按以下的方式操作:

POST /_aliases
{
"actions": [
{
"add": {
"indices": [ "new_index","new_index_2" ],
"alias": "new_index_alias"
}
}
]
}

​​​​​​​​​​​​​​給多個索引增加不同的別名

給索引new_index和new_index_2分別增加相同的別名new_index_alias和new_index_alias_2,操作如下:

POST /_aliases
{
"actions" : [
{ "add":{ "index" : "new_index", "alias" : "new_index_alias" } },
{ "add":{ "index" : "new_index_2", "alias" : "new_index_alias_2" } }
]
}

根據索引通配符創建別名

創建所有以new_index開頭的別名new_index_alias,操作如下:

POST /_aliases
{
"actions" : [
{ "add" : { "index" : "new_index*", "alias" : "new_index_alias" } }
]
}

​​​​​​​使用指向多個索引的別名執行索引操作

指向多個索引的別名,用於執行查詢不需要做額外的設置,如果需要用於執行索引操作,則需要在被指向的多個索引中指定用於執行索引操作的索引,否則報錯誤。

如別名new_index_alias是索引new_index和new_index_2的別名,此時沒有在new_index和new_index_2中指定哪個用於執行索引操作,則執行以下操作時:

POST /new_index_write/_doc
{
"title": "Alias for multi index write test",
"name": "Alias"
}

會報如下錯誤:

{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "no write index is defined for alias [new_index_write]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
}
],
...
"status": 400
}

這種情況需要通過設置is_write_index屬性來指定哪個索引可用於執行索引操作,重新建立別名,操作如下:

POST /_aliases
{
"actions": [
{

"add": {
"index": "new_index",
"alias": "new_index_write",
"is_write_index": true
}
},
{
"add": {
"index": "new_index_2",
"alias": "new_index_write",
"is_write_index": false
}
}
]
}

設置好後再執行索引上面的索引操作,就不會報錯了。

​​​​​​​1.1.2、​​​​​​​刪除別名

刪除單個索引別名

刪除索引new_index上的別名new_index_alias,操作如下:

DELETE /new_index/_alias/new_index_alias

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } }
]
}

​​​​​​​刪除多個索引別名

同時刪除索引new_index和new_index_2上的別名new_index_alias,操作如下:

#多個索引以英文逗號“,”分隔

DELETE /new_index,new_index_2/_alias/new_index_alias

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "remove":{"index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

同時刪除索引new_index的多個別名,多個別名以英文逗號“,”分隔,操作如下:

#多個別名以英文逗號“,”分隔

DELETE /new_index/_alias/new_index_alias_1,new_index_alias_2

​​​​​​​1.1.3、重命名別名

別名的重命名,是通過同時執行remove和add操作來實現的,該操作中的兩個動作是原子性的,不會存在別名被刪除的瞬間產生沒有指向任何索引的問題。

以下將指向new_index的別名new_index_alias重新指向new_index_2,操作如下:

POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "new_index", "alias" : "new_index_alias" } },
{ "add" : { "index" : "new_index_2", "alias" : "new_index_alias" } }
]
}

1.1.4、索引別名查看

查看單個索引的別名

查看指定索引有哪些別名,如查看索引new_index有哪些別名,操作如下:

GET /new_index/_alias/*

返回如下:

{
"new_index" : {
"aliases" : {
"new_index_alias" : { },
"new_index_alias_1" : { }
}
}
}

返回顯示索引new_index有new_index_alias和new_index_alias_1兩個別名。

​​​​​​​查看多個索引的別名

在索引參數中,通過英文逗號“,”分隔多個索引的名稱,操作如下:

GET /new_index,new_index_2/_alias/*

或者使用通配置符指定:

GET /new_index*/_alias/*

​​​​​​​確認別名是否存在

使用HEAD方法,可以檢查別名是否存在。

檢查指定別名是否屬於某個索引,操作如下:

HEAD /new_index/_alias/new_index_route_alias

存在則返回“200 - OK”,不存在則返回“404 - Not Found”。

​​​​​​​1.2、過濾器別名

過濾器別名也是屬於索引別名的一種,只是其包含了過濾條件,屬於類似視圖的別名。

索引new_index中有如下示例數據:

此處創建一個過濾器別名,通過該別名只會查看到name為”Feng”的數據,操作如下:

POST /_aliases
{

"actions": [
{
"add": {
"index": "new_index",
"alias": "new_index_feng_alias",
"filter": { "term": { "name": "feng" } }
}
}
]
}

此處為索引new_index定義了一個名為new_index_feng_alias的過濾器別名,過濾條件為name的值為”feng”,後續直接使用該別名執行查詢時,即使不帶任何條件,也只會過濾出name的值為”feng”的數據,驗證操作如下:

GET /new_index_feng_alias/_search

​​​​​​​1.3、路由別名

用於給查詢和索引操作的路由字段指定別名,可統一指定也可以分別指定,操作方式和過濾器別名一樣,也可以理解為索引的另外一種視圖。

​​​​​​​統一定義查詢和索引操作的路由別名

以下定義了索引new_index的路由別名new_index_route_alias,使用字母“a”做為路由值,操作如下:

POST /_aliases
{
"actions" : [

{
"add" : {
"index" : "new_index",
"alias" : "new_index_route_alias",
"routing" : "a"
}
}
]
}

​​​​​​​分別給查詢和索引操作定義不同的路由值

以下定義了索引new_index的路由別名new_index_route_alias_2,使用字母“a”做為索引路由值,使用字母“a,b”做為查詢路由,操作如下:

POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "new_index",
"alias" : "new_index_route_alias_2",
"index_routing":"a",
"search_routing" : "a,b"
}
}
]
}

注:查詢路由可以包含多個值,以英文逗號“,”做為分隔,但是索引路由只能夠是單一值。

​​​​​​​使用路由別名執行查詢且指定了路由字段

有時在使用路由別名執行查詢查詢操作時,又同時通過參數的方式指定路由字段,如下查詢示例:

GET /new_index_route_alias/_search?q=name:feng&routing=b,c

這種情況下,路由值就會取當前參數指定的值由與路由別名中定義的路由值的交集,當前示例就會取“b”做為查詢路由值。


分享到:


相關文章: