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="一元分詞" 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:

[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.     }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM