iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 10
0
Elastic Stack on Cloud

Python&Elasticsearch 入門系列 第 10

IT鐵人第10天 Elasticsearch 使用python建立index(2)

上篇建立了一個存放學校人員的index,可是大家可以發現上篇使用的mappings只有學生的資訊,今天來教大家如何在同一個index把mappings更換成老師的資訊

關於同一個index把mappings更換成老師的資訊這件事是什麼意思呢,我們假設下面是學生與老師儲存的資料格式
學生:

 {
    "sid": {
        "type": "integer"
    },
    "name": {
        "type": "text"
    },
    "age": {
        "type": "integer"
    },
    "class": {
        "type": "keyword"
    }
}

老師:

{
    "tid": {
        "type": "integer"
    },
    "name": {
        "type": "text"
    },
    "age": {
        "type": "integer"
    },
    "class": {
        "type": "keyword"
    },
    "salary": {
        "type": "integer"
    }
}

可以看到老師跟學生儲存的資料是有點不一樣的,當今天我們匯學生的資料時,因為現在index的mappings是學生的properties(我們已上一篇為例),所以會沒有問題,但當我們今天想匯入老師的資料時會因為資料的格式跟mappings不一樣而出錯,這時候就要把mappings換成老師的,更換的時候用的是indices底下的put_mapping這個方法,下面一樣先定義老師的mappings格式

{
    "properties": {
        "tid": {
            "type": "integer"
        },
        "name": {
            "type": "text"
        },
        "age": {
            "type": "integer"
        },
        "class": {
            "type": "keyword"
        },
        "salary": {
            "type": "integer"
        }
    }
}

可以看到跟之前mappings格式的差異是這次少了最外層的“mappings”,記得在使用put_mapping時直接從“properties”開始就可以了,下面是完整的程式碼

put_mapping

from elasticsearch import Elasticsearch

def change_mappings(es):
    body = get_teacher_mappings()
    es.indices.put_mapping(index='school_members', body=body)

def get_teacher_mappings():
    mappings = {
        "properties": {
            "tid": {
                "type": "integer"
            },
            "name": {
                "type": "text"
            },
            "age": {
                "type": "integer"
            },
            "class": {
                "type": "keyword"
            },
            "salary": {
                "type": "integer"
            }
        }
    }
    return mappings

if __name__ == "__main__":
    es = Elasticsearch(hosts='192.168.1.59', port=9200)
    change_mappings(es)

今天還要講得另外一個就是別名機制,別名機制講簡單一點就是幫index取綽號,在使用的時候不管是用本名還是綽號都找得到這個index,下面直接看程式碼:

put_alias 新增別名

#
from elasticsearch import Elasticsearch

es = Elasticsearch(hosts='192.168.1.59', port=9200)
es.indices.put_alias(index='school_members', name='school') #參數index指定index name指定別名

新增完後可以去es-head看看有沒有成功
https://ithelp.ithome.com.tw/upload/images/20200923/201299763RsHZ7TzQW.png

可以看到不管是用“school”還是“school_members”都可以找到index
https://ithelp.ithome.com.tw/upload/images/20200923/20129976t3CyGuwSpq.png

delete_alias 刪除別名

from elasticsearch import Elasticsearch

es = Elasticsearch(hosts='192.168.1.59', port=9200)
es.indices.delete_alias(index='school_members', name='school') 

今天的教學就到這邊,下篇就來試試把資料丟進ES裡面吧


上一篇
IT鐵人第9天 Elasticsearch 使用python建立index(1)
下一篇
IT鐵人第11天 Elasticsearch 使用python匯入資料
系列文
Python&Elasticsearch 入門30

尚未有邦友留言

立即登入留言