【簡介】
lucene.net好多人都知道的吧,反正我是最近纔好好的看了一下,別笑我拿歷史當新聞哦,不太瞭解Lucence的朋友先聽我說兩句哦。Lucene的知識主要分爲索引、搜索、分析器、性能優化幾個部分。索引和搜索沒啥可說的,看幾個例子就會了,來回那一套兒,循序漸進作幾個實驗就熟悉了。分析器是Lucence的精華,又分爲分詞和過濾兩部分,並且中文分詞更是難點,個人例子裏是用從博客園程序中提取出來的Lucene.Net.Analysis.Cn.dll來實現中文分詞的,誰有中科院的那套中科院ICTCLAS分詞工具的C#版麻煩提供一下哦。性能優化也很重要,由於若是要索引的文件比較大的話,創建索引的性能就會很大的降低,你能夠調整IndexWriter的幾個參數來優化索引性能,還有能夠用IndexWriter.Optimize()方法(這個方法主要是優化查詢速度,反而使索引性能有所降低),另外就是能夠用多線程來分別對不一樣的內容進行索引並保存到RAMDirectory裏,而後再把全部的內存索引合併到FSDirectory裏,甚至可讓多臺服務器分別處理內容的各個部分,而後把索引結果放到一個隊列裏,再有一臺機器去讀取索引結果隊列併合並索引結果。
作這個示例主要是爲了演示一下Lucene.net的功能,它能夠對你指定的目錄裏的.txt,.htm,.html文件進行全文索引,而後對其進行查詢。因爲若是要索引的目錄裏文件特別多特別大的話,創建索引須要花費很長的過程,因此我在示例程序裏使用了異步編程,以便在創建索引的時候不阻塞界面線程。
【內容】
一、先看一個簡單例子
public void Test1()
{
//創建一個內存目錄
Lucene.Net.Store.RAMDirectory ramDir = new Lucene.Net.Store.RAMDirectory();html
//創建一個索引書寫器
IndexWriter ramWriter = new IndexWriter(ramDir,new ChineseAnalyzer(), true);java
//要索引的詞,這就至關於一個個的要索引的文件
string[] words = {"×××", "人民共和國", "人民","共和國"}; linux
//循環數組,建立文檔,給文檔添加字段,並把文檔添加到索引書寫器裏
Document doc = null;
for (int i = 0; i < words.Length; i++)
{
doc = new Document();
doc.Add(Field.Text("contents", words[i]));
ramWriter.AddDocument(doc);
}c++
//索引優化
ramWriter.Optimize();程序員
//關閉索引讀寫器,必定要關哦,按理說應該把上面的代碼用try括主,在finally裏關閉索引書寫器
ramWriter.Close();ajax
//構建一個索引搜索器
IndexSearcher searcher = new IndexSearcher(ramDir);數據庫
//用QueryParser.Parse方法實例化一個查詢
Query query = QueryParser.Parse("中華人民","contents",new ChineseAnalyzer());編程
//獲取搜索結果
Hits hits = searcher.Search(query);數組
//判斷是否有搜索到的結果,固然你也能夠遍歷結果集並輸出
if (hits.Length() != 0)
MessageBox.Show("有");
else
MessageBox.Show("沒有");
}
二、其它的具體看下載代碼吧。
下載的文件裏有個doc的文件夾,裏面有4個文本文件,你們能夠試着給那個目錄創建索引,而後搜索一下「人民」,「中華」等幾個關鍵字,看看能出來搜索結果嗎?簡單說一下示例程序,就是遍歷一個目錄,找出全部文本和網頁的文件,創建Lucene的Document文件,並索引了文件的目錄和內容,而後添加到索引器裏,最後在程序執行目錄的Index子目錄裏創建索引,這一部分的調用使用了異步委託。搜索的時候就是在Index目錄裏檢索符合某個關鍵字的條目。
【注意】
一、創建完索引後必定要調用IndexWriter的Close方法,不然若是你要索引的目錄裏的文件少於minMergeDocs的話,是不能創建索引的。
二、Field.Text的靜態方法有兩個重載版本,若是第二個參數是string的話那麼這個字段既索引也存儲,若是是TextReader的話只索引不存儲,這點要搞清楚,另外在構建TextReader的時候要注意使用合適的編碼格式,不然有的文件讀出來是亂碼,創建的索引確定也是按亂碼創建的咯。
【小節】
其實lucene你們誰也是學學就會,關鍵要是整一個像google,baidu這樣的搜索引擎就難了,好歹這搜索引擎也是一個行業呢,因此誰有興趣,好好鑽研一下搜索行業的相關技術,沒準靠這個還能創業呢,是吧。
再問一下,《lucence實戰》有中文版嗎?或者其它關於Lucence的中午圖書,給推薦一本。
最後借貴地和你們討論一個問題:從長遠考慮,程序員學那項技術比較有前途?作程序也好幾年了,想找一個領域好好深刻一下,之後作一個行業的領域專家。那樣纔不會太累,要不什麼都鼓搗,太累了,並且還不容易出成績。我列舉了幾個方向,你們幫忙分析分析,謝謝。
一、linux+oracle(走數據庫管理的路線)
二、彙編、c底層驅動開發(聽說很簡單,就那麼幾個指令,學一年就精通了,不像.NET,得老跟着走)
三、ec++,kjava嵌入式開發(包括手機遊戲,路由固件等開發)
四、即時通信行業(網絡編程,包括網絡遊戲的服務端編程這些)
五、搜索行業(不太瞭解)
六、OA、工做流(本身作一套不用編程,拖拖拽拽畫畫就能實現企業業務流程的電子化,infopath,OSS,formserver,WF的那一套)
七、.net網站開發(範圍很大,要掌握的東西太多,會的人不少,深刻的不多)
八、流媒體開發(3G時代這玩意兒不知道能不能派上用場)
【參考】
idior的《Lucene.net系列》
李剛、宋偉、邱哲的《ajax+lucene構建搜索引擎》性能優化