站内搜索--分词(二元、盘古)

 一般的网站中都有站内搜索,如果使用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,可以根据自己网站中涉及到的专业名词来添加更多词,让分词更加准确。

   写下这些以便以后使用到...
posted on 2012-03-15 09:51  ancient_sir  阅读(2815)  评论(0编辑  收藏  举报