2012-12-07 96 views
2

這是關於使用(關係數據庫)設計全文搜索的系統架構問題。我使用的特定軟件是Solr和PostgreSQL,僅供參考。搜索和數據庫設計

假設我們正在建設有兩個用戶安迪和貝蒂的論壇 -

Post ID | User | Title    | Content 
--------|-------|-------------------|--------------------------- 
1  | Andy | Dark Knight rocks | Dark Knight rocks blah 
2  | Betty | I love Twilight | Twilight blah blah 
3  | Andy | Twilight sucks | Twilight sucks blah 
4  | Betty | Andy sucks  | Twilight rocks, Andy sucks 

當職位表中的Solr進行索引,我們可以輕鬆地返回通過相關性排序,以」崗位Q =暮光之城「或」?q =黑暗+夜晚「。

現在我們想添加一個新功能來搜索用戶而不是帖子。一個簡單的實現只需索引用戶名並將「Andy」返回爲「?q = a」和「Betty」爲「?q = b」,但如果我們想讓我們的系統更智能以考慮用戶因爲貝蒂比安迪更多地提到暮光之城,所以將「貝蒂」之前「安迪」改回「?q =暮光之城」。

您將如何設計系統以高效處理數十萬用戶和數百萬帖子的用戶搜索功能?

回答

0

我相信術語頻率包含在全文搜索排名中。它是名爲information retrieval的研究區域的一部分。還有另一個名爲inverse document frequency的值,它過濾掉了常用術語。

排列文本還有其他一些常見步驟,如果您有興趣,您可以查看OpenNLP項目。

在數據庫設計方面,有太多可以在一篇文章中報道,我不是寫它的人。普遍的共識似乎是針對非常大的系統,他們關鍵的是建立一個有效的索引,然後在多臺機器上分發這個索引來擴展性能。我建議您閱讀Page Rank以及Google如何開發其系統作爲起點。

1

User上劃面會返回每個用戶的結果數量。如果安迪寫了15 帖子匹配暮光之城,而貝蒂寫10,分面將返回他們這樣。

但是如果雙方都寫了15篇關於暮光之城的文章,那麼這對他來說無濟於事,但是安迪本來應該是更加相關的;你會看到所有方面的數據(在這種情況下是15,15),即使你只看到(比方說)前5名的成績,而安迪做了4個成績。


如果上述解決方案不夠好,認爲寫的

type: suggest_user_type (so you can distinguish them by a `fq`) 
user: Andy (the user) 
concatted_posts: "I think Twilight.." (concatenate the users latest 50 posts) 

文件每週一次後臺作業。如果你

fq=type:suggest_user_type& 
q=concatted_posts:twilight& 
fl=user 

你的基礎上concatted_posts相對於twilight相關用戶的排序列表。

+0

感謝您的建議,但在面向用戶時應該面向哪些字段? – Jerry

+0

當然,在文檔中您需要一個'user'字段來面向。它也應該是'string'類型。 – aitchnyu