【问题标题】:Ranking Algorithm Optimization in RailsRails 中的排名算法优化
【发布时间】:2013-02-14 22:55:24
【问题描述】:

我需要使用 Mongoid 对 Rails 应用程序中的帖子进行排名,并且我正在寻找有关如何高效、准确地执行此操作的意见。

目前,我编造的方式效率极低。

现在我正在根据这样的方法对模型进行排序:

def hotness
  return (self.confidence*(self.popularity+0.3))/Math.sqrt((Time.now - Time.at(self.created_at)))
end

然后我根据热度对数组进行排序并将其打印到页面上。这是错误的做法,而且性能现在还没有发生。

我不确定有什么更好的方法。

还有其他不需要时间调用的函数,我可以想象不同的方法来做这些,但仍然需要输入。优化对我来说很重要。

提前非常感谢。如果需要,我可以澄清任何事情。

【问题讨论】:

  • 您到底在寻找什么?完全不同类型的排名算法?只是在不改变实际行为的情况下提高性能?
  • 那么您想在 Mongoid 查询中进行排序吗?
  • 我想知道是否有比这更有效的返回结果的方法。最好的办法是将这个结果放入一个字段然后定期更新吗?这似乎是一个可能的解决方案,然后我只需要查询一个可排序的数字,但我正在寻找任何可以帮助我做出正确选择的输入。

标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongoid


【解决方案1】:

根据您上面的评论 - 如果这是可以缓存在字段中并定期更新的结果类型,或者在保存模型时 - 那么这是最好的方法(就查询性能而言MongoDB)。

所以你最终会得到一些类似的东西:

class Post
  include Mongoid::Document

  field :hotness, :type => Float, :default => 0
  field :confidence, :type => Float, :default => 0
  field :popularity, :type => Float, :default => 0

  before_save :refresh_hotness

  scope :hottest, desc(:hotness)

  protected
  def refresh_hotness
    self.hotness = (self.confidence*(self.popularity+0.3))/Math.sqrt((Time.now - Time.at(self.created_at)))
  end
end

然后,您可以使用Post.hottest 获取已排序的“最热门”帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2011-09-01
    • 1970-01-01
    • 2016-07-30
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多