视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
标签云在MongoDB和go中的实现
2020-11-09 13:32:18 责编:小采
文档


所以每个blog的标签应该是作为一个数组内嵌在blog记录中。那么就需要遍历所有的blog记录才能统计处所有tag的使用情况。 两种处理方式:

  1. 用一个额外的集合来保存tag的统计信息,所有涉及tag的操作都去更新这个集合。
  2. Schedule一个后台运行的job,定时运行mongodb的MapReduce操作来计算tag的使用数据。

第二种方式:

job := mgo.MapReduce {
 Map: "function(){if(!this.tags) return; for(i in this.tags){emit(this.tags[i],1);}}",
 Reduce: "function(key, values) {var sum = 0; for(i in values){sum = sum + values[i];} return sum;}",
 Out: bson.M{"replace":"tags"},
 }
 
 func CollectTags() {
 c := session.DB(DB).C("blog")
 _,err:= c.Find(nil).MapReduce(job, nil)
 if err!= nil {
 //TODO: better logger
 fmt.Println(err)
 }
 
 time.AfterFunc(MapReduceInterval, CollectTags)
 }
 
 func main() {
 go CollectTags()
 //Other...
 }
 

有了数据,tag云的生成就比较简单了,这里用的是wikipedia上介绍的计算公式:

template:

{{if .}}
 
 {{range $tag, $size := .}}
 {{$tag}}
 {{end}}
 
 {{end}}
 

最大字体选择28,最终效果即如主页所示。

下载本文
显示全文
专题