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. 使用hadoop命令rcc生成Record 一个简单的方法来实现自己的定义writable对象

    hadoop 的bin文件夹以下一个rcc命令,网上介绍非常少.看了一下源代码.发现能够用来生成 java和c++的hadoop Record 类代码,比起自己直接实现writable 接口.简单非常 ...

  2. Discuz 楼主帖子采集

    try { ; i < ; i++) { var html = GetHtmls("http://bbs.fobshanghai.com/viewthread.php?tid=3885 ...

  3. 使用Bootstrap 他写道网站

    新发现vdceye有些难看的网站,为了找到一个bootstrap工具,我一次又一次地写信给网站 这个工具是很容易使用 http://vdceye.com/ 版权声明:本文博客原创文章,博客,未经同意, ...

  4. 【原创】构建高性能ASP.NET站点之三 细节决定成败

    原文:[原创]构建高性能ASP.NET站点之三 细节决定成败 构建高性能ASP.NET站点之三 细节决定成败 前言:曾经就因为一个小小的疏忽,从而导致了服务器崩溃了,后来才发现:原来就是因为一个循环而 ...

  5. ORA-01791: not a SELECTed expression 一种是不 bug 的 bug!

    [ora11@lixora ~]$ !sql sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Wed Aug 27 09: ...

  6. Maven本地仓库配置

    一. 为什么配置? 默认情况下,maven的本地仓库在C盘下用户文件夹: .m2/repository.全部的maven构件(artifact)都被存储到该仓库中.以方便重用. 可是放在C盘一个是占用 ...

  7. uva 10817 - Headmaster's Headache ( 状态压缩dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每 ...

  8. SQL Server审计功能入门:更改跟踪(Change Tracking)

    原文:SQL Server审计功能入门:更改跟踪(Change Tracking) 介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据, ...

  9. Unity项目优化--开发项目的小经验

    原文地址:http://blog.csdn.net/liang_704959721/article/details/8548619 我们主要使用 3dsmax2010 进行制作,输出 FBX的类型导入 ...

  10. NSIS:超级轻量皮肤SkinH

    原文 NSIS:超级轻量皮肤SkinH 这虽然是一个其他软件的皮肤控件,不过拿来用到NSIS上还是不错的.控件加皮肤文件只有100多K,可以说是比较难得了! 看一下效果:   代码示例: 01 #皮肤 ...