lucene.net中每个分词器都是一个类,同时有一个辅助类,这个辅助类完成分词的大部分逻辑。分词类以Analyzer结尾,辅助类通常以Tokenizer结尾。分类词全部继承自Analyzer类,辅助类通常也会继承某个类。
首先在Analysis文件夹下建立两个类,EasyAnalyzer和EasyTokenizer。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
其中分词辅助类中的IsTokenChar这个函数是分词的关键,分词核心逻辑会根据这个函数返回的值进行分词,如果返回false,则会以这个字符进行一次划分。
测试代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
ITermAttribute:The term text of a Token.