在关系数据库如mysql中标签云的实现是显而易见的,标签和blog分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 MongoDB为快速水平扩张以及性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系: Generally, for "contai
在关系数据库如mysql中标签云的实现是显而易见的,标签和blog分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。
MongoDB为快速水平扩张以及性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系:
Generally, for "contains" relationships between entities, embedding should be be chosen. Use linking when not using linking would result in duplication of data.
所以每个blog的标签应该是作为一个数组内嵌在blog记录中。那么就需要遍历所有的blog记录才能统计处所有tag的使用情况。 两种处理方式:
第二种方式:
一款很稀有的jQuery+echarts上传图片生成文字标签云代码,基于echarts图表插件和jQuery实现根据图片样式生成彩色文字标签云特效,点击标签关键词还可以放大。
89
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 .}}
 <div class="tagcloud">
 {{range $tag, $size := .}}
 <a style="font-size: {{$size}}px; margin-right:5px;" href="http://chunhe.info/blogs/tags/{{$tag}}">{{$tag}}</a>
 {{end}}
 </div>
 {{end}}
 最大字体选择28,最终效果即如主页所示。
原文地址:标签云在MongoDB和go中的实现, 感谢原作者分享。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号