索引別名
- 索引別名可以通過API的方式進行操作
- 一個索引別名可以映射到一個或一個以上的索引
- 索引名和索引別名不能重復,在集群中都是唯一的
- 別名可以與過濾器結(jié)合使用
- 一個索引可以擁有多個別名
- 只映射到一個索引的索引別名默認可以寫入。目前有特性,當別名關(guān)聯(lián)到多個索引的時候,可以通過配置別名的寫入索引,來通過別名寫入,否則無法通過別名進行寫入操作,但是非日志類的索引不建議使用。
Elasticsearch 有一些操作索引別名的APIs,可以為索引設(shè)計索引別名。索引別名API允許用一個名字來別名一個索引,所有的API都會自動將別名轉(zhuǎn)換為實際的索引名稱。一個別名支持被映射到一個以上的索引,當指定它時,別名將自動展開到被別名的索引。一個別名也可以與一個過濾器相關(guān)聯(lián),該過濾器將在搜索時自動應(yīng)用,并路由值。一個別名不能與一個索引有相同的名稱。
下面是一個將別名alias1
與索引test1
關(guān)聯(lián)的例子:
PUT gudong20230629001
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "gudong20230629001", "alias" : "gudong" } }
]
}
GET gudong20230629001
{
"gudong20230629001": {
"aliases": {
"gudong": {}
},
"mappings": {},
"settings": {
"index": {
"creation_date": "1688021916053",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "o_Q5UdbPRWy4w_E9QJS9PA",
"version": {
"created": "6070299"
},
"provided_name": "gudong20230629001"
}
}
}
}
刪除同樣的索引別名
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "gudong20230629001", "alias" : "gudong" } }
]
}
GET gudong20230629001
{
"gudong20230629001": {
"aliases": {},
"mappings": {},
"settings": {
"index": {
"creation_date": "1688021916053",
"number_of_shards": "5",
"number_of_replicas": "1",
"uuid": "o_Q5UdbPRWy4w_E9QJS9PA",
"version": {
"created": "6070299"
},
"provided_name": "gudong20230629001"
}
}
}
}
重命名一個別名是一個簡單的remove
然后add
操作,在同一個API中。這個操作是原子的,不需要擔心短時間內(nèi)別名不指向索引的問題:
在一次api請求的actions是什么樣的原子原子性,gudong20230629002索引實際上不存在,請求直接異常退出。
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "gudong20230629001", "alias" : "gudong" } },
{ "add" : { "index" : "gudong20230629001", "alias" : "gudong" } }
]
}
下例子,請求成功結(jié)束,雖然gudong20230629001上并沒有別名gudong,但是有remove操作沒有影響add操作。
POST /_aliases
{
"actions" : [
{ "remove" : { "index" : "gudong20230629001", "alias" : "gudong" } },
{ "add" : { "index" : "gudong20230629001", "alias" : "gudong" } }
]
}
在一個API中一次為一個索引別名關(guān)聯(lián)多個索引的寫法有:
- 將一個別名與一個以上的索引相關(guān)聯(lián),只需要幾個
add
動作:
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "gudong20230629001", "alias" : "gudong" } },
{ "add" : { "index" : "gudong20230629002", "alias" : "gudong" } }
]
}
- 可以用
indices
數(shù)組語法為一個動作指定多個索引:
POST /_aliases
{
"actions" : [
{ "add" : { "indices" : ["gudong20230629001", "gudong20230629002"], "alias" : "gudong" } }
]
}
-
glob模式(通配符模式)也可以用來將一個別名與多個具有共同名稱的索引聯(lián)系起
在計算機編程中,特別是在類似Unix的環(huán)境中,術(shù)語globbing有時被用來指基于通配符的模式匹配。名詞 "glob "用來指代一個特定的模式,例如 “使用glob *.log來匹配所有這些日志文件”。它的符號比正則表達式更簡單。
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "gudong20230629*", "alias" : "gudong" } }
]
}
glob模式別名是對某一時刻,集群上滿足條件的索引映射生效,不會隨著匹配該模式的新索引的添加/刪除而自動更新。
也可以在一次操作中把一個索引和一個別名互換:
索引名稱和別名名稱 不是不能重名嗎?這方式可以跳過驗證?這里的actions里面的add和remove_index是原子的。如果只add,則會報錯。
PUT gudong20230629001
PUT gudong20230629002
POST /_aliases
{
"actions" : [
{ "add": { "index": "gudong20230629002", "alias": "gudong20230629001" } },
{ "remove_index": { "index": "gudong20230629001" } }
]
}
要在一個動作中指定多個別名,也存在相應(yīng)的aliases
數(shù)組語法。
帶有過濾器的別名
帶有過濾器的別名提供了一種簡單的方法來創(chuàng)建同一索引的不同 “視圖”。過濾器可以使用Query DSL來定義,并應(yīng)用于所有的搜索、計數(shù)、通過查詢刪除和更多類似的操作,都有這個別名。
要創(chuàng)建一個過濾的別名,首先我們需要確保這些字段已經(jīng)存在于mappings中:
PUT /test1
{
"mappings": {
"_doc": {
"properties": {
"user" : {
"type": "keyword"
}
}
}
}
}
現(xiàn)在我們可以創(chuàng)建一個別名,在字段user
上使用一個過濾器:
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test1",
"alias" : "alias2",
"filter" : { "term" : { "user" : "donny" } }
}
}
]
}
Routing
可以將路由值與別名相關(guān)聯(lián)。這個功能可以和過濾別名一起使用,以避免不必要的分片操作。
下面的命令創(chuàng)建了一個新的別名alias1
,指向索引test
。在alias1
被創(chuàng)建后,所有使用這個別名的操作都會被自動修改為使用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"
}
}
]
}
如上例所示,搜索路由可以包含幾個用逗號分隔的值。索引路由只能包含一個單一的值。
如果一個使用路由別名的搜索操作也有一個路由參數(shù),那么將使用搜索別名路由和參數(shù)中指定的路由的交集。例如,下面的命令將使用 "2 "作為路由值:
GET /alias2/_search?q=user:kimchy&routing=2,3
Write Index
我們可以將別名所指向的索引作為寫索引。當被指定時,所有針對指向多個索引的別名的索引和更新請求將試圖解析到作為寫索引的那個索引。每個別名在同一時間只能有一個索引被指定為寫入索引。如果沒有指定寫索引,并且有多個索引被別名引用,那么將不允許寫。
可以使用別名API和索引創(chuàng)建API來指定一個與別名相關(guān)的索引作為寫索引。
設(shè)置一個索引作為別名的寫入索引也會影響到在Rollover過程中對該別名的操作。
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test",
"alias" : "alias1",
"is_write_index" : true
}
},
{
"add" : {
"index" : "test2",
"alias" : "alias1"
}
}
]
}
在這個例子中,我們將別名alias1
與test
和test2
相關(guān)聯(lián),其中test
將是被選擇寫入的索引。
PUT /alias1/_doc/1
{
"content": "Test Content"
}
被索引到/alias1/_doc/1
的新文件將被當作/test/_doc/1
來索引。
GET /test/_doc/1
要交換哪個索引是一個別名的寫入索引,可以利用Aliases API來做一個原子交換。這種交換不依賴于動作的順序。
POST /_aliases
{
"actions" : [
{
"add" : {
"index" : "test",
"alias" : "alias1",
"is_write_index" : false
}
}, {
"add" : {
"index" : "test2",
"alias" : "alias1",
"is_write_index" : true
}
}
]
}
如果別名沒有為一個索引明確設(shè)置is_write_index: true
,并且只引用了一個索引,那么這個被引用的索引就會表現(xiàn)得好像它是寫入索引,直到引用了另外一個索引。在這一點上,將沒有寫入索引,寫入將被拒絕。
REST單一添加一個別名
也可以用REST端點添加一個別名
PUT /{index}/_alias/{name}
參數(shù) | 解釋 |
---|---|
index |
別名所指的索引. 可以是以下任一一個 `* |
name |
別名的名稱。必填項。 |
routing |
可選項,路由值 |
filter |
可選項,過濾器 |
你也可以使用復數(shù)的_aliases
。
示例:
-
增加一個基礎(chǔ)別名
PUT /logs_201305/_alias/2013
-
增加一個帶過濾器的別名
首先創(chuàng)建索引并為
user_id
字段添加一個映射:PUT /users { "mappings" : { "_doc" : { "properties" : { "user_id" : {"type" : "integer"} } } } }
然后為一個特定的用戶添加別名:
PUT /users/_alias/user_12 { "routing" : "12", "filter" : { "term" : { "user_id" : 12 } } }
索引創(chuàng)建是增加別名
別名也可以在索引創(chuàng)建期間指定:
PUT /logs_20162801
{
"mappings" : {
"_doc" : {
"properties" : {
"year" : {"type" : "integer"}
}
}
},
"aliases" : {
"current_day" : {},
"2016" : {
"filter" : {
"term" : {"year" : 2016 }
}
}
}
}
刪除別名
刪除別名的REST endpoint 是: /{index}/_alias/{name}
路徑參數(shù) | 備注 |
---|---|
index |
別名所指的索引。`* |
name |
別名的名稱。`* |
或者你可以使用復數(shù)的_aliases
。例子:
DELETE /logs_20162801/_alias/current_day
檢索現(xiàn)有別名
獲取索引別名API允許通過別名名稱和索引名稱進行過濾。這個api重定向到主節(jié)點并獲取所請求的索引別名,如果有的話。這個api只對找到的索引別名進行序列化。
參數(shù)名 | 說明 |
---|---|
index |
要獲取別名的索引名稱。通過通配符支持部分名稱,也可以指定多個索引名稱,用逗號分隔。也可以使用一個索引的別名。 |
alias |
響應(yīng)中要返回的別名的名稱。和index選項一樣,這個選項支持通配符和指定多個用逗號隔開的別名的選項。 |
ignore_unavailable |
如果指定的索引名稱不存在,該怎么做。如果設(shè)置為true ,那么這些索引將被忽略。 |
REST的端點地址: /{index}/_alias/{alias}
.
示例:
查詢索引logs_20162801
下的所有別名:
GET /logs_20162801/_alias/*
Response:
{
"logs_20162801" : {
"aliases" : {
"2016" : {
"filter" : {
"term" : {
"year" : 2016
}
}
}
}
}
}
在任何索引中具有2016年名稱的所有別名:
GET /_alias/2016
Response:
{
"logs_20162801" : {
"aliases" : {
"2016" : {
"filter" : {
"term" : {
"year" : 2016
}
}
}
}
}
}
任何索引中以20開頭的所有別名:文章來源:http://www.zghlxwxcb.cn/news/detail-622647.html
GET /_alias/20*
Response:文章來源地址http://www.zghlxwxcb.cn/news/detail-622647.html
{
"logs_20162801" : {
"aliases" : {
"2016" : {
"filter" : {
"term" : {
"year" : 2016
}
}
}
}
}
}
到了這里,關(guān)于【ES實戰(zhàn)】索引別名的使用說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!