0

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

我现在有这就是:

每个岗位有描述其主题2到3个字topic属性。

然后我得到他们的查看次数顶帖(我也喜欢可&的最爱,但对于时间使用简单的观点是):

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属性的职位?

回答

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。一旦你写了这个方法,你可以根据它的输出进行排序。

0

如果您需要比您当前的排名算法更复杂一些,您应该看看how sites like reddithackernews来处理此问题。这是相当复杂的,但你应该能够在Ruby中找到每个算法的实现。