重写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.
分类:
lucene.net
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现