用户匹配系统,高效的搜索方式



编辑:我知道已经一年多了,但我终于找到了解决这个问题的新方法。看一下这个问题的更新:Rails 3用户匹配算法到SQL Query (COMPLICATED)

我在一个根据回答的问题匹配用户的网站上工作。

匹配百分比计算每次用户,例如,访问另一个用户的配置文件页面。因此,匹配百分比不会存储在数据库中,而是一直重新计算。

现在我想建立一个搜索,用户可以搜索他们的最佳匹配。

我的问题是,做这件事最有效的方法是什么?

如果我有5万用户,我必须按匹配百分比排序。我是否需要计算一个用户与其他5万用户之间的匹配百分比,然后从中创建一个列表?听起来效率太低了。这不会大大降低应用程序的速度吗?

我希望有人能帮我解决这个问题,因为这让我有点头疼。

编辑:为了弄清楚一点,下面是我的user、questions、answers、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

所以有一个问题列表(有这个问题的可能答案),用户给出他们的"UserAnswers"对这些问题,分配问题对他们的重要性以及他们接受其他用户的答案。

如果你取User1和User2,你寻找常见的回答问题,所以UserAnswers其中的question_id是相同的。他们有十个共同的问题。User1将前5个问题的重要性值设为10,将其他5个问题的重要性值设为20。用户2给出了两个20值和三个10值问题的可接受答案。总分70分。可达到的最高积分当然是20x5 + 10x5……所以User2达到了70/150 * 100 = 46.66%…对于User1在User2给这些问题分配的分数中达到了多少,反过来也可以做同样的事情。然后将这两个百分比通过几何平均值组合起来:百分率1 *百分率2的平方根……这给出了最终的匹配百分比

@Wassem的答案似乎对你的问题很有帮助。我还建议你采用一种方法,在新答案和新接受的答案上更新百分比。

我已经创建了一个仅数据库的解决方案(gist),它可以工作,但有一个额外的中间表的复杂性。

理想情况下,您应该创建两个表,一个用于重要性,另一个用于百分比匹配。当用户指定/更新某个答案的重要性或将某个答案标记为可接受时,您应该在这些表中创建/插入/删除行。还可以利用delayed_job或rescue在后台更新特定操作的表。

您可能需要运行sql来同步两个新表中的数据,因为在某些情况下,由于并发性和更新操作的顺序可能会产生不一致。

更新一个被接受的答案应该是直接的,因为你只需要更新一对。但如果有人给一个问题分配了重要性,可能会有很多计算,很多百分比可能需要更新。为了避免这种情况,您可以选择只维护每个对的重要性总和表,在需要时更新它,并动态计算实际百分比(以db off-course为单位)。

我建议您保留数据库中所有用户的匹配百分比。创建一个表matches,其中包含一对用户的匹配百分比。您不需要保存数据库中所有用户对的匹配百分比。只有当其中任何一个用户接受了其他用户的答案时,才会计算两个用户的有效匹配百分比。大多数用户不会接受大多数其他用户的答案。

我建议您计算并保存匹配百分比,而不是在用户访问另一个用户配置文件的时候。但是当一个用户接受另一个用户的回答时。这将确保您不会进行任何不必要的计算,并且一对用户的匹配百分比始终是fresh

最新更新