实施趋势主题

时间:2014-02-17 16:19:29

标签: ruby-on-rails database activerecord ruby-on-rails-4 trending

我目前正在为我的Rails应用程序实现趋势主题。

我现在拥有的是:

每个帖子都有topic属性,描述其主题的2到3个字。

然后我根据他们的观看次数得到了顶级帖子(我也喜欢和收藏夹可用,但暂时只使用视图):

def trending_topics
  Post.order("COALESCE(impressions_count, 0) DESC").limit(200)
end

然后我所做的只是选择唯一的主题并显示其中的一些:

  <% trending_topics.select(:topic).map(&:topic).uniq.take(10).each do |topic| %>
      <li><%= topic %></li>
  <% end %>

我的问题是:

  1. 有没有办法最频繁地出现:topic,对它们进行排名, 并选择那些作物的奶油?
  2. 这是一种可持续的方式来跟踪热门话题吗?如果不, 有没有办法让它更有效率?
  3. 有没有更好的方法来实现搜索的功能 帖子中最受欢迎且常见的:topic属性?

2 个答案:

答案 0 :(得分:0)

回答你的问题:

(1)是的,您可以获得每个:topic频率的哈希值,如下所示:

array = trending_topics.select(:topic).map(&:topic)
freq = array.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
# => {'topic1'=>3, 'topic2'=>3, 'topic3'=>1, ...}

(2)这是“可持续的”,因为随着您引入的帖子/主题数量的增加,它不会增加复杂性(因为您仍在前200个帖子中提取样本)虽然随着帖子数量的增加,获得“前200名”会占用更多的计算时间。

(3)我认为impressions_count不是一个很好的方法来跟踪趋势,因为对我来说impressions_count的总数是印象,虽然你想要它的一些时间方面(例如impressions_this_week)。

因此,一种方法是引入定期更新的impressions_this_week列。然后你可以根据它进行选择。

另一种方法是编写一个方法,使用整体impressions_count以及created_atupdated_at时间戳来计算帖子的“热门”程度。您可以使用简单的衰减函数执行此操作,然后调整该函数的常量,直到获得所需的衰减。这里显示的概念类似于http://blog.notdot.net/2009/12/Most-popular-metrics-in-App-Engine。一旦编写了该方法,就可以根据其输出进行排序。

答案 1 :(得分:0)

如果您需要比当前排名算法更复杂的东西,您应该看看how sites like reddithackernews处理此问题。它相当复杂,但是如果你谷歌的话,你应该能够在Ruby中找到每种算法的实现。