上一篇介紹了object,今天來講另一個進階應用的數據結構: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
}
}
"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吧!