当前位置: 首页 > news >正文

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

目录

Lucene.net站内搜索—1、SEO优化
Lucene.net站内搜索—2、Lucene.Net简介和分词
Lucene.net站内搜索—3、最简单搜索引擎代码
Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
Lucene.net站内搜索—5、搜索引擎第一版实现
Lucene.net站内搜索—6、站内搜索第二版

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:

[html] view plain copy 在CODE上查看代码片 派生到我的代码片
  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="一元分词" οnclick="btnOnePartWord_Click" />  
  7.         <asp:Button ID="btnTwoPartWord" runat="server" Text="二元分词"   
  8.             οnclick="btnTwoPartWord_Click" />  
  9. <asp:Button ID="btnPanGu" runat="server" Text="盘古分词" οnclick="btnPanGu_Click" />  
  10.             <asp:ListBox ID="lstWord" runat="server" Width="112px"></asp:ListBox>  
  11.     </div>  
  12. </form>  

cs:

[csharp] view plain copy 在CODE上查看代码片 派生到我的代码片
  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.   
  7. namespace SearchDemo.Pages  
  8. {  
  9.     public partial class 分词算法 : System.Web.UI.Page  
  10.     {  
  11.         protected void Page_Load(object sender, EventArgs e)  
  12.         {  
  13.   
  14.         }  
  15.   
  16.         protected void btnOnePartWord_Click(object sender, EventArgs e)  
  17.         {  
  18.             Analyzer oneAnalyzer = new StandardAnalyzer(); //一元分词  
  19.             PartWordMethod(oneAnalyzer);  
  20.         }  
  21.   
  22.         private void PartWordMethod(Analyzer analyzer)  
  23.         {  
  24.             lstWord.Items.Clear();  
  25.             //Analyzer analyzer = new PanGuAnalyzer();  
  26.             TokenStream tokenStream = analyzer.TokenStream("", new StringReader(txtContent.Text));  
  27.             Lucene.Net.Analysis.Token token = null;  
  28.   
  29.             while ((token = tokenStream.Next()) != null)  
  30.             {  
  31.                 string word = token.TermText();  
  32.                 lstWord.Items.Add(word);  
  33.             }  
  34.         }  
  35.   
  36.         protected void btnTwoPartWord_Click(object sender, EventArgs e)  
  37.         {  
  38.             Analyzer oneAnalyzer = new CJKAnalyzer(); //二元分词  
  39.             PartWordMethod(oneAnalyzer);  
  40.         }  
  41.         protected void btnPanGu_Click(object sender, EventArgs e)  
  42.         {  
  43.             Analyzer oneAnalyzer = new PanGuAnalyzer(); //盘古分词  
  44.             PartWordMethod(oneAnalyzer);  
  45.         }  
  46.     }  

相关文章:

  • 201521123040《Java程序设计》第1周学习总结
  • Android内存管理之道
  • 关于二维数组求解面积的问题
  • 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
  • Linux下搭建gtk+2.0开发环境
  • ThreadPoolExecutor使用介绍
  • nginx参考时间模型和几种常见的I/0模型
  • 搭建项目自动化框架的搭建、改进与思考
  • 54.使用$.extend()扩展Object对象
  • Java数据库表自动转化为PO对象
  • 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
  • QNAP TS-219P NAS容量扩充
  • jQuery File Upload 判断图片尺寸,限定图片宽高的办法
  • iOS:申请google map key--不要忘了×××
  • shell中检查某个命令是否存在
  • conda常用的命令
  • co模块的前端实现
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • flutter的key在widget list的作用以及必要性
  • Javascript Math对象和Date对象常用方法详解
  • Javascript编码规范
  • ng6--错误信息小结(持续更新)
  • PAT A1050
  • Redis的resp协议
  • 构造函数(constructor)与原型链(prototype)关系
  • 今年的LC3大会没了?
  • 经典排序算法及其 Java 实现
  • 容器服务kubernetes弹性伸缩高级用法
  • 三栏布局总结
  • 深度解析利用ES6进行Promise封装总结
  • 实现简单的正则表达式引擎
  • 数组大概知多少
  • 交换综合实验一
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​什么是bug?bug的源头在哪里?
  • #{} 和 ${}区别
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (02)vite环境变量配置
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)c52学习之旅-简单了解单片机
  • (二)Linux——Linux常用指令
  • (二十三)Flask之高频面试点
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (六)激光线扫描-三维重建
  • (未解决)macOS matplotlib 中文是方框
  • (一)appium-desktop定位元素原理
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./configure,make,make install的作用
  • .NET 5种线程安全集合
  • .net core 连接数据库,通过数据库生成Modell
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net 访问电子邮箱-LumiSoft.Net,好用