基于lucene.net的网站标签系统设计

来源:互联网 发布:淘宝申请中国制造 编辑:程序博客网 时间:2024/04/20 17:44

      标签系统是目前网站中比较流行的一种数据分类方式,通过设置在网站文章或贴子上的标签属性,可以向用户立体的多方位的展示信息,其好处是不言而谕的,看看豆瓣、Discuz!、qq空间吧,这里不再赘述。一般来说标签系统需要提供两个功能,第一个当然就是根据标签来搜索了,另一个就是自动从文章提取标签,这个功能可以看看qq空间,Discuz!不支持这个功能,下面就从这两个方面来阐述一下我的设计方案。
自动提取标签功能,分析了qq空间的功能,基本思路是先分词,然后计算每一个词在文章中出现的频率,根据系统中存在的热门标签来计算每一个词的推荐分值,至于公式可以根据自己的需要自己定义,我的公式是:每个词的频率/所有词的频率的和 * 40% + 该词在热门标签中的热度*60%,热度计算公式:每个热门标签的频率/所有热门标签频率的和。经过计算的分值倒叙排序后就可以算出推荐的标签。中文分词的算法有很多种,可以选择lucene自带的分词器,它是基于二分法的,准确率不高,我推荐使用的中科院的免费版,它的准确率和速度都是不错的,代码可以免费得到,我做了些修改:收集了中英文停词,一次性导入词库,删除了所有监控事件,提高效率。热门标签的热度计算可以采用异步形式,每一个小时计算一次,计算结果保存到内存里,计算步骤如下:1、根据数据库保存的标签数据,数据库设计时要保存每个标签和文章的数据对,比如ID,标签。2、分组统计每一个标签出现的次数,按次数倒序排序后,取前1000个。3、以key/value的形式保存到内存,可以hashtable的方式直接保存到当然网站系统内存,也可以保存到memcached中。
      建立标签索引,一般来说自动提取的标签多多少少会不符合用户的需要,所以要提供手动修改的功能,符合要求的标签需要被全文索引后才能被搜索,建立索引需要使用lucene提供的IndexWriter类,不过需要我们自己提供标签分词工具,我采用的索引是以逗号分割的,所以自己继承的Analyzer也很简单,直接采用split方法分割就可以了。为了提高标签建立的效率,可以参用先使用RAMDirectory在内存索引在一次性写入磁盘文件的方式,这样效率会提高很多,我测试的,100万条数据的速度可以相差10几倍。
      标签查询,查询就简单了,直接采用lucene的语法就可以了,lucene的查询语法可以在官网上查到,支持bool,与、或、非、range等,lucene也可以支持根据字段排序,比如根据时间排序,排序会影响效率,本机测试,带排序的100万条数据需要1.4秒,而不排序只需要70几毫秒,一般我们的用法可以加上时间范围,去一段时间内的数据再排序,这样会提高效率。
综述,使用lucene来查询比使用mysql数据库查询效率会提高很多,在50万条数据以内是毫秒级的,这对一般的小网站已经是足够了,希望这篇文章可以抛砖引玉。

原创粉丝点击