lucene.net開發教程與總結(一)

lucene.net開發教程與總結(一)

Posted on 2008-09-13 17:36 chen eric 閱讀(436) 評論(0) 編輯 收藏 
lucene.net開發教程與總結(一)
  Lucene是有名的開源搜索框架,具體細節自己查。對於英文來說,其對分詞的處理已經比較不錯,但是對於日文,中文等的處理太差,所以對我們中文來說,分詞是瓶頸。因爲不是按照間隔區分“詞彙”的,我才接觸,到項目中,使用,已經是快一年了,因爲自己很喜歡c#,所以,一直就關注的是LUCENE.NET,沒有時間看lucene(java)版本的。當然,我的java水平真的拿不出來讓大家一笑。
   
  我先通俗的介紹一些其保存數據的方式,它把數據按照其一個索引值保留,搜索的時候直接對其索引位置獲取,再由這個值取具體的值。
  
  下面我說使用,和常見的DB操作一樣,需要了解的是:新建,刪除,編輯更新(先刪除,再更新),合併,優化。
  
  我下面有時間的話會詳細的介紹其使用,由於開源,我就把關鍵代碼貼出來就可以了。

  1:創建索引
  首先創建一個目錄,保持所有文件的。
//private Directory directory =new RAMDirectory(FSDirectory.GetDirectory(@TUtility.StaticIODataPath, true));
//private Directory directory =new RAMDirectory(@TUtility.StaticIODataPath);
private Directory directory =FSDirectory.GetDirectory(@TUtility.StaticIODataPath.TrimEnd('/')+"/"+"wordtype", false);//第一次True,以後false
  
註釋說明:
  RAMDirectory(緩存)和 FSDirectory都可以使用(注意 FSDirectory.GetDirectory 的 create 參數,爲 true 時將刪除已有索引庫文件,如果需要,則可通過 IndexReader.IndexExists() 方法判斷)

從指定目錄打開已有索引庫。
private Directory directory = FSDirectory.GetDirectory("c:"index", false);

將索引庫載入內存,以提高搜索速度。
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:"index", false));
//或
//private Directory directory = new RAMDirectory(c:"index");


  第二步驟就是創建一個分析器,就是來分詞的,中文分詞的有雨痕的,shooot的,SharpICTCLAS等等,還有個JB 海量的,主要依靠的是龐大的分詞庫,這個在以後的慢慢歲月有時間的話我慢慢說:

private Analyzer analyzer = new StandardAnalyzer();

我這是標準的分詞,Lucene自帶的
  
然後就是創建一個IndexWriter ,和XmlWriter一樣,往下面寫:
     IndexWriter writer = new IndexWriter(ufile, analyzer, true);//第一次True,以後false
    //writer.SetMaxFieldLength(1000);
    writer.SetMaxMergeDocs(2);//文檔合併數
    //writer.SetMergeFactor(1000);//合併因子
    writer.AddDocument(GetNewDocument(new string[]{initvalue,initvalue}));
    writer.Optimize();
    writer.Close();//保存
    writer.SetUseCompoundFile(true);//合併文件

GetNewDocument是我自己定義的,原型如下:

private Document GetNewDocument(string[] args){
    Document document = new Document();
    document.Add(new Field("HashKey",        args[0],            Field.Store.YES, Field.Index.UN_TOKENIZED));
    document.Add(new Field("ChineseName",    args[1],            Field.Store.YES, Field.Index.UN_TOKENIZED));
    return document;
}


主要是創建一個Term,是索引的最小因子,記錄的就是這個對象了。
 
 其中,需要說明的是,IndexWrite.AddDocument這個方法不檢測重複值,如果你需要更新的話,就先找出原來已經存在的(系列教程會說的),刪除,然後添加。

IndexWriter的第三個參數是當你判斷segments文件存在不,true意味着新建庫或覆蓋已經存在的庫,false意味着追加到已經存在的庫,如果false但是沒有segment和cfs文件,那就報錯,所以之前的,判斷是不是第一次,就重要了:

if(!IndexReader.IndexExists(directory)){
//第一次,需要初始化
//MakeInit(directory);
}
  


,創建索引文件差不多就到這裏吧,具體細節可以複製具體的類或者方法名,自己查。

 以後我慢慢的吧所有的體會都寫出來。再做和demo!偉大的計劃啊 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章