昨天介紹了在cluster層級中監控cluster的健康,以及透過各種指標檢視index健康程度,避免資料的缺失。
今天我們要進入下一個層次,index層次。
index其實可以想像成是SQL資料中的Database,可以透過簡單的API以及request工具,去建立新的index,並且設定該index。
設定好index後,就可以將資料餵到index中。
在放入我們的資料前,需要先建構一個索引,建構索引的方式非常簡單,只需要針對你的Elasticsearch endpoint,加上index名稱進行put的request,就能夠建立索引。建構索引後,就可以開始把資料餵到這個索引中。
PUT /demo-index
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "demo-index"
}
記得之前我們有提到,關於index的一些查詢,其中會包含各種Index的設定,例如分片,或是mapping的field,同樣可以在這個request中的Body去給予這些參數
// 分片及複本相關設定
PUT /demo-index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
}
mapping field相關設定
// 分片及複本相關設定
PUT /demo-index
{
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"field1": { "type": "text" }
}
}
}
若已經存在這個index名稱,則會出現以下錯誤
{
"error": {
"root_cause": [
{
"type": "resource_already_exists_exception",
"reason": "index [demo-index/ptXE4q4dRc-fuZNOBU51sQ] already exists",
"index_uuid": "ptXE4q4dRc-fuZNOBU51sQ",
"index": "demo-index"
}
],
"type": "resource_already_exists_exception",
"reason": "index [demo-index/ptXE4q4dRc-fuZNOBU51sQ] already exists",
"index_uuid": "ptXE4q4dRc-fuZNOBU51sQ",
"index": "demo-index"
},
"status": 400
}
而針對index去做刪除也非常簡單,只需要對這個index進行Delete的request
DELETE /demo-index
回傳就算是成功
{
"acknowledged": true
}
Mapping其實就是建立index中每個欄位的(properties)的屬性,讓這些properties能夠指向某種類型的field。
這邊簡單說明一下,因為elasticsearch存放的是JSON格式,並沒有限定每筆資料一定要有固定的property,因此若先設定好mapping,在資料餵進來時就會自動把這個欄位mapping到該屬性。
PUT /demo-index/_mapping
{
"properties": {
"email": {
"type": "keyword"
}
}
}
如此一來就將mapping加入demo-index了
GET /demo-index/_mapping
{
"demo-index": {
"mappings": {
"properties": {
"email": {
"type": "keyword"
}
}
}
}
}
這個意思就是,加入一個email的property mapping
這邊也簡單介紹一下alias,alias意思就是可以創建index別名,讓這個別名也索引到該index
PUT /demo-index
PUT /demo-index/_alias/demo
如此一來,demo這個名稱也會導向demo-index
這樣你一定會想說,各種名稱如果指來指去會不會很亂,所以API中也有設計雙向的查法。
假設你想查詢某個別名的指向,你可以使用:
GET /*/_alias/demo
假設確定了這個名稱是index,你也可以透過查詢他有哪些別名
GET /demo_index/_alias
最後簡單講解一下我對alias用法的理解,當今天你的資料index,存在有可能改變的前提下,你可以先透過一個對外的alias,索引到你原先的index,舉例來說,我原先的index叫做demo1,我給他一個別名是board。
當我今天背後資料index需要替換時,替換的index為demo2,我不需中斷user的使用,只需要將別名索引到我換的新的index demo2,就可以在不中斷使用下改置,而舊的索引只需要刪除舊行,操作手法如下:
POST /_aliases
{
"actions": [
{ "remove": { "index": "demo1", "alias": "board" }},
{ "add": { "index": "demo2", "alias": "board" }}
]
}
各位有在看我文章的大家,因為平常時間比較有限,所以我有時候會用後來補充的方式去更新文章,而更新的通常會是我消化用法後,實際情境的案例,再麻煩各位定期看一下更新了,也幫我檢查一下是否想法上有問題了,謝謝!