<!-- [if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!-- [if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" LatentStyleCount="156">
</w:LatentStyles>
</xml><![endif]-->
<!-- [if gte mso 10]>
<mce:style><!--
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
-->
<!-- [endif]-->
标签系统是目前网站中比较流行的一种数据分类方式,通过设置在网站文章或贴子上的标签属性,可以向用户立体的多方位的展示信息,其好处是不言而谕的,看看豆瓣、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万条数据以内是毫秒级的,这对一般的小网站已经是足够了,希望这篇文章可以抛砖引玉。
分享到:
相关推荐
基于Lucene.Net垂直搜索引擎完全开源版.rar
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮
C# 基于Lucene.Net的站内搜索
自己修改的基于lucene.net 2.9和highlighter插件的简单例子
Lucene.Net 包含Lucene.Net1.3.2.1到最新版Lucene.Net2.9.4多有DLL,并且Lucene.Net2.9.2和Lucene.Net2.9.4提供Demo和功能文档
lucene.net 2.9.1 源码,lucene.net 2.9.1最新dll
lucene.net 完全入门教程,包括 lucene.net 介绍, lucene.net工作模式, lucene.net分词方法和中文分词方法, lucene.net索引的建立详解, lucene.net搜索详解, lucene.net的下载方法, lucene.net搜索结果实现...
Lucene.net下载 Lucene.net3.03,最新版的Lucene.net下载。
lucene.NET使用教程整合 lucene.NET使用教程整合 lucene.NET使用教程整合 lucene.NET使用教程整合 lucene.NET使用教程整合 lucene.NET使用教程整合
垂直搜索引擎完全开源版 c#开发基于Lucene.net 1.前台结合Lucene的搜索引擎功能,使得数据搜索更快; 2.新增加采集功能,采集时图片下载,flash下载功能,默认配置的是南海网分类信息的采集规则; 3.该代码简洁,...
基于lucene.net 和highlighter插件的简单例子,对excel按行给出摘要
lucene.net基本应用(doc) lucene.net基本应用(doc) lucene.net基本应用(doc)
基于Lucene.net的四个版本(更新至2018.1.26 ) ------------------------------- Lucene.Net.2.9.2.2-支持.net2.0和4.0; Lucene.Net.2.9.4.1 仅支持.net4.0; Lucene.Net.3.0.3 z支持3.5和4.0; Lucene.Net.4.8.0-...
闲着无聊做的lucene的知识管理,基本的lucene的用法都有。
做全文搜索引擎lucene.net包的完整dll,包括:App_Licenses.dll、DictSeg.dll、FredCK.FCKeditorV2.dll、FreeTextBox.dll、FTAlgorithm.dll、FTAlgorithm.pdb、Highlighter.Net.dll、Lucene.China.dll、Lucene.Net....
Lucene.net 2.0 API,Lucene.net 2.0 dll,Lucene.net学习探索着必备。
Lucene.net 搜索引擎 Lucene.net源码 Lucene.net中文文档; 好的东西需要分享
Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引...开发人员可以基于Lucene.net实现全文检索的功能。
Lucene.Net 3.0 最新源码 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,...开发人员可以基于Lucene.net实现全文检索的功能。
Lucene.Net 2.0 已编译 dll