2012-11-17 48 views
3

假設我有兩個名爲「twitter_user」和「twitter_comments」的表。Elastic Search中的一對多關係

twitter_users具有以下字段:用戶名和生物 twitter_comments具有以下字段:用戶名和評論

顯然,一個用戶在twitter_users 1項,可能很多twitter_comments

我想在Elastic Search中對twitter_users和twitter_comments進行建模,在查詢時讓ES搜索這兩個模型,並知道評論計入Twitter用戶的整體相關性分數。

我知道我可以通過創建一個額外的字段(除了用戶名和生物)以及所有註釋連接在一起來模仿這一點。但是還有另一種「更清潔」的方式嗎?

回答

8

這取決於。

如果你只是希望能夠尋找一個網友的評論,全文,並在所有領域,簡單地存儲用戶對象中的所有評論(無需要連接任何東西):

{ 
    "user" : { 
     "username" : "TestUser", 
     "bio" : "whatever", 

     "comments" : [ 
     { 
      "title" : "First comment", 
      "text" : "My 1st comment" 
     }, 
     { 
      "title" : "Second comment", 
      "text" : "My 2nd comment" 
     } 
     ] 
    } 
} 

如果您需要將基於評論的查詢映射爲nested(在提交任何數據之前),以便將每條評論視爲單個項目。

爲了您的得分,只需添加另一個字段「comment_count」並將其用於提升/得分。

2

由於Thorsten已經建議你可以使用嵌套查詢,這是一個很好的方法。

或者,您可以將註釋索引爲用戶的子項。然後,您可以像現在這樣搜索用戶,使用top_children查詢搜索評論以查找與您的搜索評論相關的所有內容,並最終使用booldis_max查詢將它們的評分結合在一起。

嵌套方法在搜索過程中效率更高,但每次添加附加評論時都必須對用戶和所有註釋重新編制索引。對於孩子/父母的方法,你只需要索引新評論,但搜索速度會更慢,並且需要更多的內存。