站内搜索--分词(二元、盘古)
一般的网站中都有站内搜索,如果使用Like去做,效率就会很低。
例如,百度的数据库中有上亿条数据,使用like就会造成全表扫描,什么时候才能把搜索到的结果返回给页面。
所以,Lucene.Net(搜索引擎核心)就会被大家所采用。
一、分词
分词是核心的算法,Lucene.Net本身是不提供分词算法的。
示例代码:
//Analyzer analyzer = new PanGuAnalyzer();//盘古分词 //Analyzer analyzer = new CJKAnalyzer(); //二元分词 //Analyzer analyzer = new StandardAnalyzer();//一元分词 TokenStream tokenStream = analyzer.TokenStream("", new StringReader(TextBox1.Text)); Lucene.Net.Analysis.Token token = null; while ((token = tokenStream.Next()) != null) { Response.Write(token.TermText() + "<br/>"); }
一元分词算法(StandardAnalyzer)
将中文子符一一分割,英文字符以空格、标点分割。 效果如图 1-1
二元分词算法(CJKAnalyzer)
将中文字符每两个组合,英文字符以空格、标点分割。效果如图 1-2
网上提供的是两个类:CJKAnalyzer.cs、CJKTokenizer.cs 都继承Analyzer,多态的好处体现出来了,直接拷到自己的项目中使用。
盘古分词(比较智能)
这种算法相比较前两个分词算法,稍微体现出(百度)更懂中国
先看效果如图 1-3
网上提供了开源项目,盘古分词V1.2.0.0.zip 解压,PanGuDictionaries.zip中文件添加到项目中新建文件夹(Dict)中,项目中全选,属性窗口中:复制到输出目录,选择如果较新则复制;还要引用类库:PanGu.Lucene.Analyzer.dll、PanGu.dll
当然这个分法还能接受,其实,盘古分词有自己的词库Dict.dct,可以根据自己网站中涉及到的专业名词来添加更多词,让分词更加准确。
写下这些以便以后使用到...