2009-11-22 48 views
2

我有一個社交網絡,並通過一個API我想搜索條目。社交網絡的數據庫是mysql。我希望搜索以下列格式返回結果:匹配查詢AND是執行搜索的用戶的朋友的結果應優先於與查詢簡單匹配的結果。首先通過優先考慮用戶關係來搜索社交網絡的最佳方式是什麼?

因此,這可以在一個查詢中完成,還是必須執行兩個單獨的查詢併合並結果並刪除重複項?

我可以使用Lucene建立一個數據結構並有效地搜索該索引,但是我想知道每次創建新關係時更新文檔的代價是否會太大?

謝謝

回答

1

對Lucene的引用使方程稍微複雜一點。讓我們先解決它(或者至少得到一個基線)。

假設下面的數據模型(或東西接近

 
tblUsers 
    UserId PK 
    UserName 
    Age 
    ... 

tblBuddies 
    UserId  FK to tblUsers.UserId 
    FriendId tblUsers.Userid = Id of one of the friends 
    BuddyRating  float 0.0 to 1.0 (or whatever normalized scale) indicating 
        the level of friendship/similarity/whatever 

tblItems 
    ItemId PK 
    ItemName 
    Description 
    Price 
    ... 

tblUsersToItems 
    UserId FK to tblUsers.UserId 
    ItemId FK to 
    ItemRating float 0.0 to 1.0 (or whatever normalized scale) indicating 
       the "value" assigned to item by user. 

一個天真的查詢(但優化的一個很好的基礎)可能是:

 
SELECT [TOP 25] I.ItemId, ItemName, Description, SUM(ItemRating * BuddyRating) 
FROM tblItems I 
LEFT JOIN tblUserToItems UI ON I.ItemId = UI.ItemId 
LEFT JOIN tblBuddies B ON UI.UserId = B.FriendId 
WHERE B.UserId = 'IdOfCurrentUser' 
    AND SomeSearchCriteria -- Say ItemName = 'MP3 Player' 
GROUP BY I.ItemId, ItemName, Description 
ORDER BY SUM(ItemRating * BuddyRating) DESC 

的想法是,給定項目如果朋友是好朋友[BuddyRating]和/或朋友推薦這個項目更強烈,那麼額外的重量就越重要[商品評價]

優化此類查詢取決於項目的總數,給定用戶的好友的平均/最大數量,用戶在其列表中的平均/最大項目數。

是你想要的這種類型的想法/信息還是我錯過了這個問題?

+0

MJV,我沒有問這個問題,但我正在尋找你發佈的問題的答案 - 提供你的lucene解決方案嗎? – EugeneMi 2014-10-16 02:59:40

+0

@EugeneMi恐怕我沒有Lucene解決方案。我提供了這種普通的SQL方法來斷言這通常是OP所追求的。當時我會添加一些片段或指針。 Lucene,但很長一段時間我沒有與Solr或Lucene合作過,我當然不會使用這些系統的最新功能(特別是提升,自動排名等等),所以我甚至不會啓動。 – mjv 2014-10-16 04:06:47

1

一種方法是將所有社交網絡圖與Lucene分開存儲。在Lucene上運行關鍵字查詢,並查找網絡圖中的所有朋友。對於所有返回的朋友,通過某種因素和方式提升所有這些朋友的搜索結果。這個重新排序將在Lucene之外完成。我之前做過這樣的事情,表現相當不錯。

您還可以創建一個自定義HitCollector,它可以在Lucene中收集命中時進行提升。您必須構建屬於當前用戶的朋友的內部Lucene ID的列表。

您的社交網絡圖可以存儲在Mysql中,作爲稀疏鄰接矩陣存儲在內存中,或者您可以查看Neo4j