2

这是一个关于使用(关系)数据库设计全文搜索的系统架构问题。我使用的特定软件是 Solr 和 PostgreSQL,仅供参考。

假设我们正在建立一个有两个用户 Andy 和 Betty 的论坛——

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=twilight”或“?q=dark+night”。

现在我们要添加一个新功能来搜索用户而不是帖子。一个简单的实现会简单地索引用户名并将“Andy”返回到“?q=a”,将“Betty”返回到“?q=b”,但是如果我们想让我们的系统更智能同时考虑到用户怎么办在“Andy”之前发帖并返回“Betty”到“?q=twilight”,因为 Betty 比 Andy 更多地提到 Twilight。

您将如何设计系统以有效处理数十万用户和数百万帖子的用户搜索功能?

4

2 回答 2

1

Faceting onUser将返回每个用户的结果数。如果 Andy 写了 15个与 Twilight 匹配的帖子,而 Betty 写了 10 个,则分面将返回它们。

但如果两人都写了 15 篇关于暮光之城的帖子,那也无济于事,但安迪的应该更相关;即使您分页仅查看(例如)前 5 个结果并且 Andy 制作了其中 4 个,您也会看到所有方面计数(在这种情况下为 15、15)。


如果上述解决方案还不够好,请考虑编写以下文件的后台作业

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

于 2012-12-07T13:52:25.943 回答
0

我相信词频包含在全文搜索排名中。它是称为信息检索的研究领域的一部分。还有另一个值称为逆文档频率,它会过滤掉常用术语。

还有其他常见的文本排名步骤,如果您有兴趣,可以查看OpenNLP项目。

在数据库设计方面,一篇文章要涵盖的内容太多了,我不是写它的人。普遍的共识似乎是对于非常大的系统,他们的关键是构建一个高效的索引,然后将其分布在多台机器上以扩展性能。我建议您阅读Page Rank以及 Google 如何开发其系统作为起点。

于 2012-12-07T10:58:52.203 回答