【发布时间】:2011-10-30 20:35:06
【问题描述】:
编辑:我知道已经一年多了,但我终于对这个问题有了新的认识。要查看此问题的更新,请查看此问题:Rails 3 user matching-algorithm to SQL Query (COMPLICATED)
我正在开发一个根据回答的问题匹配用户的网站。
例如,每次用户访问另一个用户的个人资料页面时,都会计算匹配百分比。所以匹配百分比不存入数据库,一直在重新计算。
现在我想构建一个搜索功能,用户可以在其中搜索最佳匹配。
我的问题是,最有效的方法是什么?
如果我有 50k 用户,我必须按匹配百分比对他们进行排序。我是否必须计算一个和其他 50k 用户之间的每个匹配百分比,然后从中创建一个列表?对我来说听起来有点低效。这不会大大降低应用程序的速度吗?
我希望有人能帮我解决这个问题,因为这让我有点头疼。
编辑: 为了澄清一点,这是我的用户、问题、答案、user_answers 和accepted_answers 的数据库模型:
Tables:
Users(:id, :username, etc.)
Questions(:id, :text)
Answers(:id, :question_id, :text)
UserAnswers(:id, :user_id, :question_id, :answer_id, :importance)
AcceptedAnswers(:id, :user_answer_id, :answer_id)
Questions <-> Answers: one-to-many
Questions <-> UserAnswers: one-to-many
Users <-> UserAnswers: one-to-many
UserAnswers <-> AcceptableAnswers: one-to-many
因此,有一个问题列表(包含此问题的可能答案),用户对这些问题给出“用户答案”,分配该问题对他们的重要性以及他们从其他用户那里接受的答案。
然后,如果您使用 User1 和 User2,则查找常见的已回答问题,因此 UserAnswers 的 question_id 相同。他们有 10 个共同的问题。用户 1 给前五个问题的重要性值 10,给其他五个问题的重要性值 20。用户 2 对两个 20 值问题和三个 10 值问题给出了可接受的答案。总分70分。最高可达到的分数当然是 20x5 + 10x5... 所以 User2 达到 70/150 * 100 = 46,66% ... 同样的事情是相反的,对于 User1 达到了 User2 分配给这些问题的分数的多少.然后通过几何平均值将这 2 个百分比组合起来:sqrt of percent1 * percent2 ... 这给出了最终匹配百分比
【问题讨论】:
-
这是一个复杂的信息检索问题。每次计算匹配百分比可能永远不够快。准确检查您是如何计算匹配百分比的会有很大帮助。
-
如果我是你,我会创建一个索引来存储每个用户与每个其他用户的百分比关系。创建一个单独的应用程序,每 5 分钟运行一次并重新创建此索引,然后在您的 rails 代码中只需简单地对列表进行排序并返回结果。我没有看到可以让您“即时”计算所有百分比的解决方案
-
您的 rails 应用程序会更快。您排序 50,000 个百分比,而不是计算 50,000 个百分比。您只需要在内容更新后重新计算百分比。所以第一次是 25 亿,后来很少了。
-
你有一个非常有趣的问题。我正在考虑解决方案并进一步感兴趣。据我所知,您不能将最终百分比存储在某个地方,因为当有新问题或答案出现时,您将无法直接更改百分比(涉及几何平均值)。您首先需要更改重要性的总和并从那里重新计算百分比。我有一些半生不熟的 sql,但远非可接受的解决方案。随时通知我们!
-
@Mexxer:提出了一个可能的解决方案,主要是在gist.github.com/1158234@ 的 db 中进行所有计算
标签: ruby-on-rails database database-design