iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 8
0
Elastic Stack on Cloud

Python&Elasticsearch 入門系列 第 8

IT鐵人第8天 Elasticsearch 認識Mapping(3) parent/child

上一篇介紹了object,今天來講另一個進階應用的數據結構:parent/child

Parent/Child

前面有提到nested object可以關聯資料,parent/child也是一種關聯資料的結構,但與nested object不同的地方在於nested object關聯的資料必須在同一個文檔,但parent/child可以關聯不同的文檔,下面簡單舉個例子
nested object:

#將王小明跟年齡10歲關聯與許小美與年齡12歲關聯
文檔1
{
    "students": [
        {
            "name": "王小明",
            "age": 10
        },
        {
            "name": "許小美",
            "age": 12
        }
    ]
}

parent-child:

#將文檔1與文檔2、3關聯
文檔1 parent
{
    "identity": "student",
    "type": {
        "name": "parent"
    }
}
文檔2 child
{
    "name": "王小明",
    "age": 10,
    "type": {
        "name": "child",
        "parent": id #父文檔的id
    }
}
文檔3 child
{
    "name": "許小美",
    "age": 12,
    "type": {
        "name": "child",
        "parent": id #父文檔的id
    }
}

mappings

"properties": {
    "doc_type": {        #要關聯的field
        "type": "join",   
        "relations": {
            "parent": "child"  #關聯的值,前面是父文檔後面是子文檔
        }
    }
}

parent/child有以下幾個特性:
1.parent文檔可以單獨更新
2.child文檔可以被添加、修改或者删除,不影響parent文檔或者其他child文檔
3.child或parent都可以單獨的被查詢
4.parent文檔可以同時有多個child文檔,但1個child文檔只能有1個parent文檔
5.parent跟child必須要在同一個shard上

ES在記憶體裡面維護了一個parent/child關係的對映表,以便加速查詢,這種對映使用的是doc-value,如果資料量大到記憶體放不下,會自動的儲存到磁碟中,因此parent/child這種結構在搜尋時會給查詢性能帶來重大負擔,因此在搜尋這方面是nested object > parent/child,但前面有提到parent/child的結構child文檔可以單獨更新修改刪除,而nested object每次更新必須更新整個文檔,所以在更新性能上是nested object < parent/child,這兩種結構沒有一定哪種比較優秀,要使用哪一種取決於使用時的需求
子文檔多,需常更新 → parent/child
需時常查詢 → nested object

今天得介紹就到這邊,下篇就來用python建立第一個Elasticsearch Index吧!


上一篇
IT鐵人第7天 認識Elasticsearch Mapping(2) object
下一篇
IT鐵人第9天 Elasticsearch 使用python建立index(1)
系列文
Python&Elasticsearch 入門30

尚未有邦友留言

立即登入留言