我有一个用例要求,我想设计一个hashtag排名系统。应该选择10个最流行的#标签。我的想法是这样的:
[hashtag,rateofhitsperminute,rateofhisper5minutes]
然后我会查询,找出10个最受欢迎的#hashtags,其每分钟的速率最高。
我的问题是,我可以使用哪种数据库来提供像'rateofhitsperminute'这样的统计数据?
计算这样的细节和存储在db中的好方法是什么?有些DB提供这些功能吗?
答案 0 :(得分:4)
首先,计算“每分钟命中率”:
[hits during period]/[length of period]
因此,费率将根据期间的长短而有所不同。 (最后一分钟?最后10分钟?自从点击开始被记录以来?首先使用了标签?)
所以你真正想要存储的是点击次数,而不是点击率。最好是:
现在需要选择感兴趣的时间段,并查询数据库以查找在此期间点击次数最多的前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
最后,这里有一些与此问题相关的高级资源:
答案 1 :(得分:3)
没有数据库只有内置的每分钟速率统计信息,但任何现代数据库都可用于创建一个数据库,您可以在其中轻松计算每分钟的速率或您需要的任何其他计算值。
你的问题就像要问哪种车可以从纽约开车到洛杉矶 - 没有车可以自行开车或加油(我应该小心这个比喻因为我猜汽车现在差不多了! ),但你可以驾驶任何你喜欢的汽车从纽约到洛杉矶,有些会更舒适,更省油,有些比其他更快,但是你将不得不开车和加油。
答案 2 :(得分:3)
您可以使用InfluxDB。它非常适合您的用例,因为它是为处理时间序列数据而创建的(例如“每分钟点击次数”)。
在您的情况下,每次点击时,您都可以发送包含主题标签名称和时间戳的记录。
数据是可查询的,并且已有工具可以帮助您处理或可视化(例如Grafana)。
答案 3 :(得分:1)
如果您对大型数据集感到满意,可以自行存储和计算这些信息。
我认为Mongo在基于索引的查询方面相当快,所以你可以构建类似的东西。
每次标记被&#34;点击&#34;或访问您可以将此信息存储为行
[Tag][Timestamp]
以这种方式存储它可以让您首先运行简单的分组,计数和排序操作,这将使您获得计算10个最受欢迎标签的第一个所需能力。
使用此格式的信息,您可以根据标签和时间戳执行进一步的查询,以计算特定标签在时间X和Y之间的点击量,这将为您提供每期的点击次数。
这样做的好处:
这样做的负面影响: