Lucene.net站内搜索—2、Lucene.Net简介和分词

2015-03-24 23:10 by 邹琼俊, 118 阅读, 1 评论, 收藏编辑

Lucene.Net简介

Lucene.Net是由Java版本的Lucene(卢思银)移植过来的,所有的类、方法都几乎和Lucene一模一样,因此使用时参考 Lucene 即可。

Lucene.Net只是一个全文检索开发包(就像ADO.Net和管理系统的关系),不是一个成型的搜索引擎,它的功能就是:把数据扔给 Lucene.Net ,查询数据的时候从Lucene.Net 查询数据,可以看做是提供了全文检索功能的一个数据库。SQLServer中和Lucene.Net各存一份,目的不一样。Lucene.Net不管文本 数据怎么来的。用户可以基于Lucene.Net开发满足自己需求的搜索引擎。

Lucene.Net只能对文本信息进行检索。如果不是文本信息,要转换为文本信息,比如要检索Excel文件,就要用NPOI把Excel读取成字符 串,然后把字符串扔给Lucene.Net。Lucene.Net会把扔给它的文本切词保存,加快检索速度。midomi.com。因为是保存的时候分词 (切词),所以搜索速度非常快!索引库默认保存的是“词的目录”

要快速的从《红楼梦》中找出词,可以先遍历这本书建一个词和页数的对应目录。第一次“找词”非常慢,但是搜索就快了。

分词

分词是核心的算法,搜索引擎内部保存的就是一个个的“词(Word)”。英文分词很简单,按照空格分隔就可以。中文则麻烦,把“北京,Hi欢迎你们大家” 拆成“北京 Hi 欢迎 你们大家”。

“the”,“,”,“和”,“啊”,“的”等对于搜索来说无意义的词一般都属于不参与分词的无意义单词(noise word)。

Lucene.Net中不同的分词算法就是不同的类。所有分词算法类都从Analyzer类继承,不同的分词算法有不同的优缺点。

(*)内置的StandardAnalyzer是将英文按照空格、标点符号等进行分词,将中文按照单个字进行分词,一个汉字算一个词。代码见备注

(*)二元分词算法,每两个汉字算一个单词,“欢迎你们大家”会分词为“欢迎   迎你  你们 们大  大家”,网上找到的一个二元分词算法CJKAnalyzer。面试的时候能说出不同的分词算法的差异。

无论是一元分词还是二元分词,分词效率比较高,但是分出无用词,因此索引库大。查询效率低。

基于词库的分词算法,基于一个词库进行分词,可以提高分词的成功率。有庖丁解牛、盘古分词等。效率低。

1、 StandardAnalyzer示例(不用背代码,拷过来知道改哪里即可,我复制粘贴的代码你也一样复制粘贴)

Analyzer analyzer = new StandardAnalyzer();

TokenStream tokenStream = analyzer.TokenStream("",newStringReader("我是真的爱你"));

Lucene.Net.Analysis.Token token = null;

while ((token =tokenStream.Next()) != null)

{

Console.WriteLine(token.TermText());

}

盘古分词算法使用

具体用法参考《PanguMannual.pdf》

打开PanGu4Lucene\WebDemo\Bin,添加对PanGu.dll(同目录下不要有Pangu.xml,那个默认的配置文件的选项对于分词结果有很多无用信息)、PanGu.Lucene.Analyzer.dll的引用

把上面代码的Analyzer用PanGuAnalyzer代替

运行发现提示需要dct文件,因为不能把词库写死在dll中,因此需要提供单独的词库文件,根据报错放到合适的路径中。

通用技巧:把Dict目录下的文件“复制到输出目录”设定为“如果较新则复制”,每次生成的时候都会自动把文件拷到bin\Debug 下,非常方便。(只有Web应用程序有那个选项,网站没有。)永远不要对bing\debug下的东西做直接的修改,要改“源文件”。

词库的编辑,使用DictManage.exe,对单词编辑的时候要先查找。工作的项目中要将行业单词添加到词库中,比如餐饮搜索、租房搜索、视频搜索等。

注:出现Dict路径的问题,没有找到配置文件,默认就是Dict目录,设定Pangu.xml的复制到输出设置为“如果较新则复制”即可。或者词典目录就命名为Dict,不要配置文件。

Demo:

一元分词

1、  新建项目——ASP.NET Web应用程序SearchDemo

2、  新建文件夹lib,存放dll文件Lucene.Net.dll

3、  添加Lucene.Net.dll引用

二元分词

1、拷贝两个类到根目录下

盘古分词

1、  拷贝两个dll PanGu.dll和PanGu.Lucene.Analyzer.dll到lib目录下

2、  添加这两个dll的引用

3、  添加Dict词库目录和词库文件

4、  修改分词代码

5、  如果出现如下错误

把Dict目录下的文件“复制到输出目录”设定为“如果较新则复制”

分词代码如下:

aspx:

  1. <form id="form1" runat="server">
  2. <div>
  3. <asp:TextBox ID="txtContent" runat="server" Height="62px" TextMode="MultiLine"
  4. Width="191px"></asp:TextBox>
  5. <asp:Button ID="btnOnePartWord"
  6. runat="server" Text="一元分词" onclick="btnOnePartWord_Click" />
  7. <asp:Button ID="btnTwoPartWord" runat="server" Text="二元分词"
  8. onclick="btnTwoPartWord_Click" />
  9. <asp:Button ID="btnPanGu" runat="server" Text="盘古分词" onclick="btnPanGu_Click" />
  10. <asp:ListBox ID="lstWord" runat="server" Width="112px"></asp:ListBox>
  11. </div>
  12. </form>

cs:

  1. using Lucene.Net.Analysis;
  2. using System.IO;
  3. using Lucene.Net.Analysis.Standard;
  4. using NSharp.SearchEngine.Lucene.Analysis.Cjk;
  5. using Lucene.Net.Analysis.PanGu;
  6. namespace SearchDemo.Pages
  7. {
  8. public partial class 分词算法 : System.Web.UI.Page
  9. {
  10. protected void Page_Load(object sender, EventArgs e)
  11. {
  12. }
  13. protected void btnOnePartWord_Click(object sender, EventArgs e)
  14. {
  15. Analyzer oneAnalyzer = new StandardAnalyzer(); //一元分词
  16. PartWordMethod(oneAnalyzer);
  17. }
  18. private void PartWordMethod(Analyzer analyzer)
  19. {
  20. lstWord.Items.Clear();
  21. //Analyzer analyzer = new PanGuAnalyzer();
  22. TokenStream tokenStream = analyzer.TokenStream("", new StringReader(txtContent.Text));
  23. Lucene.Net.Analysis.Token token = null;
  24. while ((token = tokenStream.Next()) != null)
  25. {
  26. string word = token.TermText();
  27. lstWord.Items.Add(word);
  28. }
  29. }
  30. protected void btnTwoPartWord_Click(object sender, EventArgs e)
  31. {
  32. Analyzer oneAnalyzer = new CJKAnalyzer(); //二元分词
  33. PartWordMethod(oneAnalyzer);
  34. }
  35. protected void btnPanGu_Click(object sender, EventArgs e)
  36. {
  37. Analyzer oneAnalyzer = new PanGuAnalyzer(); //盘古分词
  38. PartWordMethod(oneAnalyzer);
  39. }
  40. }
  41. }
天分在于持续不断的努力

Lucene.Net简介和分词的更多相关文章

  1. Lucene.net站内搜索—2、Lucene.Net简介和分词

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  2. Lucene 03 - 什么是分词器 + 使用IK中文分词器

    目录 1 分词器概述 1.1 分词器简介 1.2 分词器的使用 1.3 中文分词器 1.3.1 中文分词器简介 1.3.2 Lucene提供的中文分词器 1.3.3 第三方中文分词器 2 IK分词器的 ...

  3. Lucene全文搜索之分词器:使用IK Analyzer中文分词器(修改IK Analyzer源码使其支持lucene5.5.x)

    注意:基于lucene5.5.x版本 一.简单介绍下IK Analyzer IK Analyzer是linliangyi2007的作品,再此表示感谢,他的博客地址:http://linliangyi2 ...

  4. ]NET Core Lucene.net和PanGu分词实现全文检索

    Lucene.net和PanGu分词实现全文检索 Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考   前言:目前自己在做使用Lucene. ...

  5. lucene教程简介

    1 lucene简介 1.1 什么是lucene     Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是 ...

  6. Lucene.net 全文检索 盘古分词

    lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ...

  7. 用于Lucene的各中文分词比较

    对几种中文分析器,从分词准确性和效率两方面进行比较.分析器依次为:StandardAnalyzer.ChineseAnalyzer.CJKAnalyzer.IK_CAnalyzer.MIK_CAnal ...

  8. lucene定义自己的分词器将其分成单个字符

    问题描写叙述:将一句话拆分成单个字符.而且去掉空格. package com.mylucene; import java.io.IOException; import java.io.Reader; ...

  9. Lucene.Net简介

    说明:Lucene.Net 只是一个全文检索开发包 .查询数据的时候从Lucene.Net查询数据.可以看做是一个提供了全文检索功能的数据库. 注意:只能搜索文本字符串. 重要概念:分词,基于词库的分 ...

随机推荐

  1. Intel® Ethernet Connection I217-V 网卡驱动(win10 ,2012)

    https://downloadcenter.intel.com/zh-cn/download/25016/-Windows-10 上面是win10 的驱动 win8.1  https://downl ...

  2. OpenGL学习日记-2015.3.13——多实例渲染

        实例化(instancing)或者多实例渲染(instancd rendering)是一种连续运行多条同样渲染命令的方法.而且每一个命令的所产生的渲染结果都会有轻微的差异. 是一种很有效的.有 ...

  3. LeetCode :: Convert Sorted Array (link list) to Binary Search Tree [tree]

    1.Given an array where elements are sorted in ascending order, convert it to a height balanced BST. ...

  4. oracle查看经常使用的系统信息

    总结了查看oracle数据库的经常使用sql ,有助于分析优化出一个健壮的系统程序来. 1.当前的数据库连接数: select count(*) from v$process 2.数据库同意的最大连接 ...

  5. CodeCounter代码统计

    今天一天写的,困死了 开发环境:VS2012 + WIN8-x64, MFC CSDN下载链接:http://download.csdn.net/detail/npu_wy/7405577 百度云下载 ...

  6. 【转】[Android实例] Handler+ExecutorService(线程池)+MessageQueue模式+缓存模式

    android线程池的理解,晚上在家无事 预习了一下android异步加载的例子,也学习到了一个很重要的东东 那就是线程池+缓存  下面看他们的理解. [size=1.8em]Handler+Runn ...

  7. poj3281-Dining ,最大流量,内置图

    id=3281">点击打开链接 分析: 求最大流 建图: 拆点 牛拆成左边与食物相连的左牛 和 右边与饮料相连的右牛 1.s->食物 连边 2.食物->左牛 3.左牛-&g ...

  8. Caused by: org.springframework.beans.NotWritablePropertyException

    1.错误叙述性说明 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -h ...

  9. 关于 pthread_cond_wait 和 pthread_cond_signal , signal 无效的问题

    关于一个消费者模式,,,引起的问题.. 我在io线程里不断的把一个函数调用放到队列里 然后ruby线程就不断的从这个队列里取出函数之争并运行. 典型的 消费者模式. 我曾经以为是这样... 这是wor ...

  10. Linux 编程学习笔记----文档管理系统

    本文从网络上完成的第 Linux在文件系统管理. 1.VFS文件系统概述 linux採用VFS来管理文件系统,并且linux设计的原则之中的一个就是everything is file.因此文件管理系 ...