Lucene.net入门学习系列(1)
Lucene.net入门学习系列(1)
Lucene.net入门学习系列(2)-创建索引
Lucene.net入门学习系列(3)-全文检索
这几天在公司实习的时候闲的蛋疼,翻了一下以往的教程和博客,看到了Lucene.net。原本想学着写一个系列的博文,由于本人水平有限,一直找不到适合的内容来写,干脆就写一个简单的Lucene.net系列文章吧。希望和大家一起学习,一起进步,有什么写错了或者有什么建议欢迎提出来。
一.引言
先说一说什么是Lucene.net。Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。
说完了Lucene.net,接着来说什么是全文检索。全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。
二.分词
前面的引言大概说了一下什么是全文检索,介绍了Lucene.net这个全文检索引擎。要做全文检索,首先要做的就是分词。
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。不过,前辈们已经做了很多工作,我们只要拿来用就行了。在这里,我们使用"盘古分词"。盘古分词是一个基于.net 平台的开源中文分词组件,提供lucene(.net 版本) 和HubbleDotNet的接口,采用字典和统计结合的分词算法,分词准确率较高。
说了那么多的废话,现在我们来看一看如何分词。
我们要添加对3个程序集的引用:
还要对字典进行设置:
1.将字典放到项目中(字典在本文末提供下载)

2.在属性中设置:把"复制到输出目录"这个选项改成"如果较新则复制"

上代码

1 /// <summary>
2 /// 分词
3 /// </summary>
4 /// <param name="word">要分的词</param>
5 /// <returns>string数组:分好的词的集合</returns>
6 public static string[] SplitWords(string word)
7 {
8 //创建列表,用来装分好的词
9 List<string> list = new List<string>();
10
11 //实例化一个PanGuAnalyzer对象
12 Analyzer analyzer = new PanGuAnalyzer();
13
14 //然后通过分析器得到一个TokenStream
15 TokenStream tokenStream = analyzer.TokenStream("", new StringReader(word));
16
17 Token token;
18 //遍历tokenStream中的Token,如果为空返回Null
19 while ((token = tokenStream.Next()) != null)
20 {
21 //将每一个分词添加到list中
22 list.Add(token.TermText());
23 }
24
25 return list.ToArray();
26 }

接下来,进行测试。

1 static void Main(string[] args)
2 {
3 const string s1 = "其中,崔家乡挂职队在崔家乡政府一周一次的“党员干部义工日”中";
4 const string s2 = "台球原来可以这样打的么?";
5
6 //我们使用linq来测试,遍历分词集合并输出
7 (from r in SplitWords(s1) select r).ToList().ForEach(a => Console.Write(a + " "));
8
9 Console.WriteLine();
10
11 (from r in SplitWords(s2) select r).ToList().ForEach(a => Console.Write(a + " "));
12
13 Console.Read();
14 }

测试结果:

我们可以看到,分出来的效果还是比较令人满意的。像"崔家乡"这些地名词,我们可以通过盘古分词附带的一个工具将词语添加进去。
(添加后要记得保存并覆盖程序使用的那个词典,否则没有效果)
注:修改的是源程序中的那个Dict字典,生成程序之后字典会复制到输出目录中

添加好词语之后我们再来进行一次测试。

我们可以看到,盘古分词已经"崔家乡"这个词当做一个词来看待了。
Dll下载地址:http://files.cnblogs.com/g1mist/SplitWords-PanGu.zip
Lucene.net入门学习系列(1)的更多相关文章
- Lucene.net入门学习系列(2)
Lucene.net入门学习系列(2) Lucene.net入门学习系列(1)-分词 Lucene.net入门学习系列(2)-创建索引 Lucene.net入门学习系列(3)-全文检索 在使用Luce ...
- Asp.Net MVC5入门学习系列③
原文:Asp.Net MVC5入门学习系列③ 添加一个视图(View) 接着上篇的入门系列,上面解说添加一个简单Controller(控制器),这里我们简单的在来添加一个View(视图)来展示我们Co ...
- Asp.Net MVC5入门学习系列②
原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用 ...
- Asp.Net MVC5入门学习系列①
原文:Asp.Net MVC5入门学习系列① 现在直接开始MVC5的学习系列,学习资源来自Micrsoft. 开始使用Asp.Net MVC 5 打开Visual Studio 2013,然后新建一个 ...
- Asp.Net MVC5入门学习系列⑦
原文:Asp.Net MVC5入门学习系列⑦ 接着上篇结尾所说,如果开发中刚才遇到Model需要添加或者减少字段/属性的话,但是刚好你也利用EF的Code frist通过Model生存的数据库,这时改 ...
- Asp.Net MVC5入门学习系列⑤
原文:Asp.Net MVC5入门学习系列⑤ 检查VS生产的编辑方法和编辑窗体 前面我们一步使用强类型,然后创建Controller(控制器)的时候,VS默认已经给我们把CURD都简单的实现了.这篇的 ...
- Asp.Net MVC5入门学习系列⑥
原文:Asp.Net MVC5入门学习系列⑥ 接着上次的篇幅,我们这篇手动来写一个查询的流程代码! 搜索/查询 流程功能的实现 那现在要做搜索(查询)功能我们第一步应该做什么呢!第一次是不是我们应该去 ...
- Asp.Net MVC5入门学习系列④
原文:Asp.Net MVC5入门学习系列④ 添加Model且简单的使用EF 对于EF(EntityFramework)不了解的朋友可以去百度文科或者在园子里搜一些简资源看下,假如和我一样知道EF的概 ...
- Lucene.net入门学习
Lucene.net入门学习(结合盘古分词) Lucene简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全 ...
随机推荐
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...
- 使用Webbrowser的一点心得体会
原文:使用Webbrowser的一点心得体会 自从用上VS2005后,发现多了个WebBrowser控件(.net 2003中不带),为图方便吧,有好多小工具就用这个写的,慢慢也有点体会了,总结一下, ...
- Linux 安装 httpd2.4.16
假设: apr安装在: /opt/httpd/apr apr-util安装在 /opt/httpd/apr-suite/apr-util apr-iconv安装在/opt/httpd/apr-suit ...
- 什么是EF, 和 Entity Framework Demo简单构建一个良好的发展环境
Entity Framwork(实体框架.缩写EF)这是ORM(Object Relational Mapping.对象映射关系)一个解决方案. EF的表映射为实体.并封装了操作方法.方便开发者 ...
- lib库实现loadrunner驱动mysql性能测试
一.添加mysql驱动链接文件到loadrunner的bin和include目录下 以下链接为本人云盘分享,也可百度自行寻找下载源. http://yunpan.cn/cfTxbANSvipGi ...
- CloudNotes
CloudNotes 今天,我发布了CloudNotes的一个更新版本:1.0.5484.36793.这个版本与1.0.5472.20097不同的是,它拥有增强的笔记列表,与之前单调的列表系统相比,新 ...
- 使用OpenCV玩家营造出一个视频控制(没有声音)
说明:OpenCV计算机视觉库,所以使用的图像或视频处理,因此,没有任何声音在播放视频的临时 软件:使用OpenCV制播放器(无声音) 功能说明:新建播放窗体.加入进度条能够拖动视频播放. 流程图: ...
- JAVA学习篇--Java类加载
由来: 与普通程序不同的是,Java程序(class文件)并非本地的可执行程序(解释性语言). 当执行Java程序时.首先执行JVM(Java虚拟机),然后再把Javaclass载入到JVM里头执行, ...
- Net Framework中的提供的常用委托类型
.Net Framework中的提供的常用委托类型 .Net Framework中提供有一些常用的预定义委托:Action.Func.Predicate.用到委托的时候建议尽量使用这些委托类型,而 ...
- 部分PC端安卓管理器使用强行断开重连的方法来连接手机,容易丢书数据,损坏数据
最近发现部分PC端的安卓管理器,貌似是百度影音以及PPTV的安卓客户端,使用强行断开手机连接,然后重新连接手机的方法,来实现客户端程序连接手机. 此时,如果刚好正在复制文件,则复制的文件会损坏,并且基 ...