2012-12-07 70 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