iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
Elastic Stack on Cloud

親愛的,我把ElasticSearch上雲了系列 第 10

Day 10 Index API介紹及使用

Day 10 Index API介紹及使用


前言

昨天介紹了在cluster層級中監控cluster的健康,以及透過各種指標檢視index健康程度,避免資料的缺失。
今天我們要進入下一個層次,index層次。
index其實可以想像成是SQL資料中的Database,可以透過簡單的API以及request工具,去建立新的index,並且設定該index。
設定好index後,就可以將資料餵到index中。

建立index API

在放入我們的資料前,需要先建構一個索引,建構索引的方式非常簡單,只需要針對你的Elasticsearch endpoint,加上index名稱進行put的request,就能夠建立索引。建構索引後,就可以開始把資料餵到這個索引中。

  • 這邊記得request時,需要進行給予Basic Auth,提供帳號密碼
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 相關使用

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,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" }}
    ]
}

後記

各位有在看我文章的大家,因為平常時間比較有限,所以我有時候會用後來補充的方式去更新文章,而更新的通常會是我消化用法後,實際情境的案例,再麻煩各位定期看一下更新了,也幫我檢查一下是否想法上有問題了,謝謝!


上一篇
Day 9 Elasticsearch API 查詢(Monitor)
下一篇
Day 11 為建構好的index增加document
系列文
親愛的,我把ElasticSearch上雲了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言