我有一个用例要求,我想设计一个hashtag排名系统.应该选择10个最流行的#标签.我的想法是这样的:
[hashtag,rateofhitsperminute,rateofhisper5minutes]
然后我将查询,找出10个最受欢迎的#hashtags,其每分钟的速率最高.
我的问题是,我可以使用哪种数据库来提供像'rateofhitsperminute'这样的统计数据?
计算这样一个细节和存储在db中的好方法是什么?有些DB提供这些功能吗?
首先,计算“每分钟命中率”:
[hits during period]/[length of period]
Run Code Online (Sandbox Code Playgroud)
因此,费率将根据期间的长短而有所不同。(最后一分钟?最后 10 分钟?自从开始记录点击次数以来?自从第一次使用主题标签以来?)
所以你真正想要存储的是点击次数,而不是率。最好是:
现在是选择感兴趣的时间段,并查询数据库以查找该时间段内点击次数最多的前 10 个主题标签。
如果您需要显示汇率,请使用上面的公式,但请注意它不会更改顶部主题标签的顺序,因为每个主题标签的周期都相同。
您可以将上述算法应用于几乎任何数据库。你甚至可以在不使用数据库的情况下完成(只需使用编程语言的内置哈希图)。
如果性能是一个问题并且会有许多不同的主题标签,我建议使用OLAP 数据库。OLAP 数据库是专门为这样的 top-k 查询(在特定时间段内)设计的。
话虽如此,以下是如何在 Solr 中完成您的用例的示例:Solr as an Analytics Platform。Solr 不是 OLAP 数据库,但此示例像 OLAP DB 一样使用 Solr,并且似乎最容易实现和适应您的用例:
您的 Solr 架构如下所示:
<fields>
<field name="hashtag" type="string"/>
<field name="hit_date" type="date"/>
</fields>
Run Code Online (Sandbox Code Playgroud)
一个示例文件是:
{
"hashtag": "java",
"hit_date": '2012-12-04T10:30:45Z'
}
Run Code Online (Sandbox Code Playgroud)
您可以使用的查询是:
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
Run Code Online (Sandbox Code Playgroud)
最后,这里有一些与这个问题相关的高级资源:
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |