首页 > 代码库 > 重写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 }
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,则会以这个字符进行一次划分。
测试代码如下:
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.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。