首页 > 代码库 > 重写lucene.net的分词器支持3.0.3.0版本

重写lucene.net的分词器支持3.0.3.0版本

lucene.net中每个分词器都是一个类,同时有一个辅助类,这个辅助类完成分词的大部分逻辑。分词类以Analyzer结尾,辅助类通常以Tokenizer结尾。分类词全部继承自Analyzer类,辅助类通常也会继承某个类。

首先在Analysis文件夹下建立两个类,EasyAnalyzer和EasyTokenizer。

 1 using Lucene.Net.Analysis; 2 using System.IO; 3  4 namespace LuceneNetTest 5 { 6     public class EasyTokenizer : CharTokenizer 7     { 8         private TextReader reader; 9         public EasyTokenizer(TextReader reader)10             : base(reader)11         {12             this.reader = reader;13         }14         protected override bool IsTokenChar(char c)15         {16             //return true;  //整行输出17             //return c != ‘,‘; //逗号分隔18             return c !=  ; //空格划分19         }20     }21 }
EasyTokenizer
 1 using Lucene.Net.Analysis; 2 using System.IO; 3  4 namespace LuceneNetTest 5 { 6     public class EsayAnalyzer : Analyzer 7     { 8         public override TokenStream TokenStream(string fieldName, TextReader reader) 9         {10             return new EasyTokenizer(reader);11         }12     }13 }
EsayAnalyzer

其中分词辅助类中的IsTokenChar这个函数是分词的关键,分词核心逻辑会根据这个函数返回的值进行分词,如果返回false,则会以这个字符进行一次划分。

测试代码如下:

 1 using Lucene.Net.Analysis; 2 using Lucene.Net.Analysis.Tokenattributes; 3 using System; 4 using System.IO; 5 namespace LuceneNetTest 6 { 7     class Program 8     { 9         static void Main(string[] args)10         {11             const string testwords = "大家好,I can speak chinese!";12             EsayAnalyzer simple = new EsayAnalyzer();13             TokenStream ts = simple.ReusableTokenStream("", new StringReader(testwords));14             while (ts.IncrementToken())15             {16                 ITermAttribute attribute = ts.GetAttribute<ITermAttribute>();17                 Console.WriteLine(attribute.Term);18             }19         }20     }21 }
Program

CITermAttribute:The term text of a Token.