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. 苹果WatchKit轻松入门

    背景 前段时间苹果Apple推出 WatchKit,用于开发Apple Watch应用,同时也推出了 Xcode6.2 Beta(非稳定版,好期待稳定版)版本用于开发 Watch App.Apple ...

  2. ZOJ3819 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江司A称号 Average Score 注册标题

    Average Score Time Limit: 2 Seconds      Memory Limit: 131072 KB Bob is a freshman in Marjar Univers ...

  3. BZOJ 1834 ZJOI2010 network 网络扩展 Dinic+EK费用流

    标题效果:给定一个n积分m无向图边,每一方有一个扩展的成本c.代表扩张1费用的交通,寻求最大流量和扩大的最大流量k最小成本 第一问直接运行的最大流量 第二个问题将是连接到一个流的末端每个边缘的起点是正 ...

  4. 解决:对 PInvoke 函数的调用导致堆栈不对称问题

    解决:对 PInvoke 函数的调用导致堆栈不对称问题 问题描述: 在使用托管代码调用非托管代码时,发生“对 PInvoke 函数“UseTwiHikVisionDllTest!UseTwiHikVi ...

  5. 又一次认识HTML,CSS,Javascript 之node-webkit 初探

    今天我们来系统的.全面的 了解一下前端的一些技术,将有助于我们写出 更优秀的 产品 出来. 什么是HTML? HTML 是用来描写叙述网页的一种语言. HTML 包括一些根节点.子节点,文本节点.属性 ...

  6. ASP.NET之AdRotator实现淘宝浏览页面的商品随机推荐功能

    如今随便上个网都能够看到淘宝.京东等各大电商平台的双十一购物狂欢宣传,从2009年開始淘宝愣是把11.11这一天打造成了全民购物狂欢节.阿里巴巴的上市更是激发了阿里人的斗志,据说他们今年的目标是100 ...

  7. 调整CentOS的文字登陆界面的分辨率

    通过文字界面登陆到系统,切换到root权限. 用vi打开  /boot/grub/menu.lst 文件  ,因为menu.lst是grub.conf文件的快捷方式,终于打开的还是grub.conf文 ...

  8. Play Modules Morphia 1.2.9a 之 Aggregation and Group aggregation

    聚合 和 分组聚合: PlayMorphia 它提供了基于开发人员models的友好接口 设想你定义了一个model.class Sales: @Entity public class Sales e ...

  9. Android 中字体的处理

    //得到TextView控件对象 TextView textView = (TextView)findViewById(R.id.custom); //将字体文件保存在assets/fonts/文件夹 ...

  10. poj 1664 把平果

    这个问题可分为两个子问题:什么时候m<n时刻,例如3苹果放在4阿菜,和3苹果放3一样的. 所以m<n时,f[m][n]=f[m][m]; 当m>=n时.可分为两种放法,一种为至少有一 ...