编辑:我知道已经有一年多了,但我终于得到了一些新问题.要查看此问题的更新,请查看此问题:
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
因此,有一个问题列表(可能有这个问题的答案),用户将“UserAnswers”提供给这些问题,分配问题对他们的重要程度以及他们从其他用户接受的答案.
然后,如果您使用User1和User2,则查找常见的已回答问题,因此UserAnswers中的question_id是相同的.他们有10个共同的问题. User1将重要性值10给予前五个问题,将重要性值20给予其他五个问题.用户2给出了两个20值和三个10值问题的可接受答案.共70分.最高可到达的分数当然是20×5 10×5 ……所以User2达到了70/150 * 100 = 46,66%……相反,User1达到了User2为这些问题分配的点的数量.然后通过几何平均值将这两个百分比组合:百分比百分比1 *百分比2 …这给出了最终匹配百分比
最佳答案 @Wassem的答案似乎就在你的问题上.我还建议您采用一种方法,在新答案和新接受的答案上更新百分比.
我创建了一个仅限db的解决方案(gist),它可以工作,但是中间表的复杂性更高.
理想情况下,您应该创建另外两个表,一个用于重要性,另一个用于百分比匹配.当用户为答案分配/更新重要性或将某些答案标记为可接受时,您应该在这些表中创建/插入/删除行.您还可以利用delayed_job或rescue来更新特定操作的后台表格.
您可能需要一次运行sqls,同时在两个新表中同步数据,因为由于并发而导致的不一致以及在某些情况下由于更新操作的排序.
接受答案的更新应该是直接的,因为您只需要更新一对.但是,如果有人重视某个问题,可能会有很多计算,很多百分比可能需要更新.为避免这种情况,您可以选择仅维护每个对的重要性总和,在需要时更新它并动态计算实际百分比(在db off-course中).