2017-02-16 93 views
1

我正在研究數據庫工具,而且我不太確定Elastic如何處理我的需求。彈性搜索深層樹模型

我有一個樹型數據結構,一棵家族樹。

根是第一個男人亞當,後來他的孩子,還有孩子等等。

元素看起來像這樣(不關心婚姻關係這個數據只是爲了讓這個想法):

{ 
    id: 1 
    name: 「Adam」 
    parentId: 0 
}, { 
    id: 2 
    name: 「Cain」 
    parentId: 1 
}, { 
    id: 3 
    name: 「Abel」 
    parentId: 1 
}, { 
    id: 4 
    name: 「johnny(Cain junior)」 
    parentId: 2 
}, … { 
    id: 12324568 
    name: 「Cain b」 
    parentId: 1434 
} 

查詢我想高管:

  1. 「全文'搜索元素名稱,響應應包含文檔和路徑。例如,搜索「該隱」應該重播:

    a。 Adam/Cain

    b。通過ID ../David/Danny/Cain b

  2. CRUD人(ID是唯一的)

  3. 通過ID獲取家譜,將響應分層樹(嵌套JSON),從 '身份證' 作爲根

  4. 樹大約是20-30〜級深,高達10000元

最後,我的問題:

  1. elasticsearch能爲我提供這種功能嗎?

  2. 我應該使用父/子方案嗎?

  3. 索引映射應該如何顯示。

回答

1

回答您的問題:

3)你的索引映射可能看起來是這樣的:

{ 
    "mappings": { 
    "my_index": { 
     "properties": { 
     "id": { 
      "type": "integer", 
      "fielddata": true <-- you need this if you're using this field for aggregations 
     }, 
     "parentId": { 
      "type": "integer" 
     }, 
     "name": { 
      "type": "text" <-- can be text/keyword depending on your requirement 
     } 
     } 
    } 
    } 
} 

2)我會建議你使用parent-child映射,這樣就可以有一個一對多的關係。 Elasticsearch維護一張父母如何與孩子通信的地圖,並且由於這種映射,查詢時間連接速度很快。你可以閱讀這個SO以瞭解嵌套的上的親子映射的基準。

1)你總是可以做一個full text搜索,只要你有你的映射爲您現場爲文本This應該幫助您識別使用類型text而不是keyword的區別。您可以將單個文檔添加到索引中,否則您可以添加包含多個文檔的bulk。這與其他CRUD操作同時進行。我仍然不知道當您通過父ID請求文檔時,分層樹會如何響應。

希望這會有所幫助!

+0

感謝@Darth_Vader,它是閱讀你的答案後,幫助 我有跟進的問題: 我怎麼可以在這裏使用父/子, 如果我理解正確的,它不會允許創建同一類型的N級樹「my_index」? 可能的力量(黑暗的一面)與你:) – Ilan