我先通俗的介紹一些其保存數據的方式,它把數據按照其一個索引值保留,搜索的時候直接對其索引位置獲取,再由這個值取具體的值。
下面我說使用,和常見的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是我自己定義的,原型如下:
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!偉大的計劃啊