2014-10-29 100 views
8

我很確定我知道這個問題的答案,但我正在尋找比我更多的Elasticsearch經驗的人的確認。在Elasticsearch中處理多對多關係的最佳實踐?

比方說,我有一個包含作者和書籍的數據庫。作者可以與0本或更多書相關聯,並且書可以與1個或更多作者相關聯。我們希望用戶能夠搜索作者姓名以查找作者和他/她的所有書籍,並且我們還希望他們能夠搜索書名以找回作者。我們知道會有大量的多作者書籍。

因爲Elasticsearch只直接支持一個級別的父子關係,並且因爲孩子只能有一個父母,所以在我看來,我們需要對數據進行非規範化並使用嵌套對象來建立這種關係。如果我們修改已出版23本書的作者的屬性,我們需要重新索引作者記錄和他/她的所有23本書記錄。

在我的幻想世界中,我很想讓這23本書中的每本都包含一組作者ID,這樣我就不必在重新編制索引作者時重新索引書籍。如果一本書只能有一個作者,但由於多對多的要求,我必須使用嵌套對象並在任何有變化的時候重新索引任何相關對象,這看起來肯定有可能使用Elasticsearch的父 - 子支持

這是正確的嗎?它看起來像更多的工作(當然還有更多的更新),但我希望以正確的方式來做到這一點,而不是引入複雜性和錯誤和瘋狂的「巧妙」方式。

任何指導,將不勝感激。

+0

是的,你需要進行非規範化。請記住,所有父子關係都提供了路由參數的語法糖,它將搜索或索引操作引導至特定分片,而不是擊中所有分片。與建模工具相比,它更像是性能優化。這真的取決於你在查詢時需要什麼。 – 2015-03-18 11:30:07

+0

@JoelP。你有沒有找到一個最好的方法來防止更新? – 2016-09-19 14:04:43

回答

3

從你的問題我可以安全地假設ES不會是你的主要數據存儲。所以關於如何對你的多對多關係進行非規範化的主要問題是找出「你將如何使用ES」。這是您希望構建的查詢。

思考「查詢命令」的設計和相應的非規範化。這裏有幾點:

  • denormalising作者ID到書中:你會期望用戶執行一個搜索,如「所有書爲userId = XYZ」。如果不是,您需要將作者的姓名作爲您的Book文檔中的多字段
  • 複製,複製和複製。找出哪些數據將大量更新(作者,因爲書籍出版後他們不會獲得作者)。將作者非規範化爲書籍(最有可能的名稱)。重複(進入另一種文檔類型)類似於「author_books」,這將是作者和支持人員的孩子經常更新(再次,從作者角度對標題和其他相關內容進行規範化搜索)。

希望這有一定的道理;)