閱讀目錄
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_labelStart">開始</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label0">Lucene簡介</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label1">效果圖</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label2">Demo檔案說明</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label3">簡單使用</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label4">重點類的說明</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label5">存在問題</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label6">調整後</a>
<a href="http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html#_label7">Lucene.Net博文與資源下載下傳</a>
<a></a>
做過站内搜尋的朋友應該對Lucene.Net不陌生,沒做過的也許會問:就不是個查詢嘛!為什麼不能使用Like模糊查找呢?
原因很簡單--模糊查詢的契合度太低,比對關鍵字之間不能含有其他内容。最重要的是它會造成資料庫全表掃描,效率底下,即使使用視圖,也會造成資料庫伺服器"亞曆山大",那LuceneNet又是一個神馬東西?如何使用?以下給出詳細的介紹包括Demo
首先說明的是--Lucene.Net隻是一個全文檢索開發包,不是一個成型的搜尋引擎,
它的功能就是負責将文本資料按照某種分詞算法進行切詞,分詞後的結果存儲在索引庫中,從索引庫檢索資料的速度灰常快.
對以上加粗的詞彙稍作下闡述:
文本資料:Lucene.Net隻能對文本資訊進行檢索,是以非文本資訊要麼轉換成為文本資訊,要麼你就死了這條心吧!
分詞算法:将一句完整的話分解成若幹詞彙的算法 常見的一進制分詞(Lucene.Net内置就是一進制分詞,效率高,契合度低),二進制分詞,基于詞庫的分詞算法(契合度高,效率低)...
切詞:将一句完整的話,按分詞算法切成若幹詞語
比如:"不是所有痞子都叫一毛" 這句話,如果根據一進制分詞算法則被切成: 不 是 所 有 痞 子 都 叫 一 毛
如果二進制分詞算法則切成: 不是 是所 所有 有痞 痞子 子都 都叫 叫一 一毛
如果基于詞庫的算法有可能:不是 所有 痞子 都叫 一毛 具體看詞庫
索引庫:簡單的了解成一個提供了全文檢索功能的資料庫
如果文字難以了解 見Demo檔案說明中的右側圖吧
首先展示效果圖,避免各位觀衆不知偶所雲.
這裡有三張圖:
圖1 簡單使用頁面效果圖

圖2 對資料庫新增資料後 索引庫更新效果圖
圖3 将圖2中的新增資料修改後 索引庫更新效果圖
圖1中的BookList.aspx 頁面
BookList.aspx.cs 背景的處理操作
使用的分詞方法與關鍵字變紅 SplitContent.cs
Analyzer類:LuceneNet中分詞算法的基類 任何自定義算法都需繼承它
FSDirectory類: 指定索引庫檔案存放檔案位置 是Directory的子類(它有兩個子類 還有一個RAMDirecory,它用來指定将索引庫檔案存放在記憶體中)
IndexReader:對索引進行讀取的類
靜态方法bool IndexExists(Directory directory)--判斷目錄directory是否是一個索引目錄
IndexWriter:對索引進行寫的類
靜态方法bool IsLocked(Directory directory)--判斷目錄是否鎖定
它在對索引目錄寫之前會把目錄鎖定,兩個IndexWrite無法同時操作一個索引檔案
IndexWrite在進行寫操作的時候會自動加鎖
Close自動解鎖
Unlock手動解鎖(通常用在程式異常退出 IndexWrite還沒來得及close)
Document類:要檢索的文檔 相當于一條記錄
Add(Field field)向文檔中添加字段
Filed類:構造函數(字段名,字段值,是否存儲原文,是否對該字段建立索引,存儲索引詞間距)
是否存儲原文:Field.Store.YES 存儲原值(如顯示原内容必須為YES) Field.Store.NO不存儲原值 Field.Store.YES壓縮存儲
是否建立索引:Field.Index.NOT_ANALYZED不建立索引 Field.Index.ANALYZED建立索引(利于檢索)
IndexSearcher:搜尋類 Searcher類的子類
Search(查詢條件Query,過濾條件Filter,檢索見過存放容器Collector)
Query類:所有查詢條件父類(子類都具有Add方法)
子類PhraseQuery:多個關鍵詞的拼接類 關鍵詞間是且的關系
query.Add(new Term("字段名", 關鍵詞)) query.Add(new Term("字段名2", 關鍵詞2)) 類似于:where 字段名 contains 關鍵詞 and 字段名2 contains 關鍵詞2
子類BooleanQuery:類似PharseQuery 通過它實作關鍵詞間的或關系(MUST必須有 Should可有可無 MUST_NOT必須沒有 詳見BookList2.aspx.cs代碼)
上述隻是Lucene.Net的簡單使用
接下來我們深入探讨上述使用過程中存在的一些問題以及指的改進的地方:
Q1:建立索引事件耗時的操作,尤其是在資料量很大的情況下,索引庫生成耗時是個問題
Q2:真實項目中肯定不可能存在建立索引按鈕,那建立索引的事件什麼時候觸發,由誰觸發呢?
Q3:如代碼中的Q一樣 多個使用者共同操作索引庫時的并發問題
解答上述三個問題
A1.耗時的操作當然另起一個背景線程來完成撒
A2.在網站Application_Start的時,利用A1中的背景線程循環監聽Books表的增删改操作,在對Books表的增删改成功之後,對索引庫相對應的資料做出增删改操作
A3.并發問題最好的解決方式--建立請求隊列,單線程處理隊列,類似于作業系統的中的生産者消費者模式
IndexManager.cs類中定義背景線程 循環監聽請求隊列 負責對索引庫的更新操作
BookList2.aspx與BookList.aspx大同小異 這裡不給出了
BookList2.aspx.cs 對資料庫資料新增 修改 删除等操作
Global.ascx中設定
<a href="http://www.cnblogs.com/birdshover/category/152283.html">http://www.cnblogs.com/birdshover/category/152283.html</a>
<a href="http://www.360doc.com/content/13/0509/08/5054188_284048627.shtml">http://www.360doc.com/content/13/0509/08/5054188_284048627.shtml</a>
<a href="http://files.cnblogs.com/piziyimao/LuceneNetDemo.7z">點選此處下載下傳示例代碼</a>