[hashtag,rateofhitsperminute,rateofhisper5minutes]
然后我将查询,找出10个最受欢迎的#hashtags,其每分钟的速率最高.
解决方法
[hits during period]/[length of period]
因此,费率将根据期间的长短而有所不同. (最后一分钟?最后10分钟?自从点击开始被记录以来?首先使用了#标签?)
所以你真正想要存储的是命中数,而不是速率.最好是:
>在一段时间内存储主题标签及其命中数(需要更少的内存/ cpu但灵活性更低)
>或每个命中的时间戳和#标签(需要更多的内存/ cpu,但更灵活)
现在需要选择感兴趣的时间段,并查询数据库以查找在此期间内点击率最高的前10个主题标签.
如果您需要显示费率,请使用上面的公式,但请注意它不会更改顶部主题标签的顺序,因为每个主题标签的周期相同.
您可以将上述算法应用于几乎任何数据库.您甚至可以在不使用数据库的情况下执行此操作(只需使用编程语言的内置hashmap).
如果性能是一个问题,并且会有许多不同的主题标签,我建议使用OLAP database. OLAP数据库是专门为这样的top-k查询(在一定时间段内)设计的.
话虽如此,这里是一个如何在Solr:Solr as an Analytics Platform中完成您的用例的示例.Solr不是OLAP数据库,但此示例使用Solr像OLAP DB,似乎是最容易实现并适应您的用例:
您的Solr架构如下所示:
<fields> <field name="hashtag" type="string"/> <field name="hit_date" type="date"/> </fields>
示例文档将是:
{ "hashtag": "java","hit_date": '2012-12-04T10:30:45Z' }
您可以使用的查询是:
http://localhost:8983/solr/select?q=*:*&facet=true&facet.field=hashtag&facet.mincount=1&facet.limit=10&facet.range=hit_date&facet.range.end=2013-01-01T00:00:00Z&facet.range.start=2012-01-01T00:00:00
最后,这里有一些与此问题相关的高级资源:
>相似的问题:Implementing twitter and facebook like hashtags
> What is the best way to compute trending topics or tags?我从这些答案得到的一个有趣的想法是使用命中计数随时间的导数来计算“瞬时”命中率.
如果可以接受大致计算,则可以使用> HyperLogLog来估计命中计数.
>如果你想在这个主题上获得真正的学术,请查看Sliding-Window Top-K.