1、indexWriter類主要功能是對索引的創建,加入Document后,合并各種索引段,以及控制與索引相關的其他方面,它是lucene索引的主要操縱者。
2、我們首先看看IndexWriter的構造函數
public IndexWriter(String path, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(String path, Analyzer a, boolean create)(廢棄,不提倡使用)
public IndexWriter(File path, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(File path, Analyzer a, boolean create)(廢棄,不提倡使用)
public IndexWriter(Directory d, Analyzer a, boolean create, MaxFieldLength mfl)
public IndexWriter(Directory d, Analyzer a, boolean create)(廢棄,不提倡使用)
public IndexWriter(String path, Analyzer a, MaxFieldLength mfl)
public IndexWriter(String path, Analyzer a)(廢棄,不提倡使用)
public IndexWriter(File path, Analyzer a, MaxFieldLength mfl)
public IndexWriter(File path, Analyzer a)(廢棄,不提倡使用)
public IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl)
public IndexWriter(Directory d, Analyzer a)(廢棄,不提倡使用)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a)(廢棄,不提倡使用)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create)(廢棄,不提倡使用)
public IndexWriter(Directory d, Analyzer a, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, IndexDeletionPolicy deletionPolicy)(廢棄,不提倡使用)
public IndexWriter(Directory d, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy, MaxFieldLength mfl)
public IndexWriter(Directory d, boolean autoCommit, Analyzer a, boolean create, IndexDeletionPolicy deletionPolicy)(廢棄,不提倡使用)
細心的讀者肯定會發現,廢棄的構造函數與提倡使用的構造函數,多了一個MaxFieldLength參數。帶有該參數的構造函數都是允許正常使用的。(注釋:廢棄的構造函數將在Lucene3.0中移除)
仔細查看其構造函數的實現呢,最終都轉化成一個私有的構造函數:如圖:
/**
* 該構造函數主要是創建一個IndexWrite對象
* d :指定的存放建立索引文件的索引目錄
* a :Analyzer 分詞分析器
* create :是否要重新寫入索引文件,如果為true,則重寫索引文件;如果為false,則追加寫入索引文件
* closeDir :一個boolean型變量,表示是否關閉索引目錄Directory d,與IndexWriter的一個成員變量相關
* deletionPolicy :指定刪除索引文件使用的策略
* autoCommit :建立索引文件后,自動提交。
* maxFieldLength : 表示索引中Field的最大長度。
*/
private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, IndexDeletionPolicy deletionPolicy, boolean autoCommit, int maxFieldLength)
throws CorruptIndexException, LockObtainFailedException, IOException {
this.closeDir = closeDir;
directory = d;
analyzer = a;
setMessageID(defaultInfoStream);//這里主要是指定infoStream,是一個PrintStream輸出流對象
this.maxFieldLength = maxFieldLength; //指定Field數據的最大長度
if (create) {
// 如果是重新創建索引文件,清除寫鎖文件write.lock
directory.clearLock(WRITE_LOCK_NAME);
}
Lock writeLock = directory.makeLock(WRITE_LOCK_NAME);
if (!writeLock.obtain(writeLockTimeout)) // 獲取寫鎖文件
throw new LockObtainFailedException("Index locked for write: " + writeLock);
this.writeLock = writeLock; //保存新的寫鎖文件
try {
if (create) {
// 如果create為true,表示重寫索引文件。重寫索引文件之前,要先讀取已經存在的索引文件,并且要清除掉歷史寫入的segment信息
try {
segmentInfos.read(directory);
segmentInfos.clear();
} catch (IOException e) {
}
segmentInfos.commit(directory); // 向指定的索引存放目錄中寫入segment信息
} else {
segmentInfos.read(directory); //讀取segment信息
// We assume that this segments_N was previously
// properly sync'd:
for(int i=0;i<segmentInfos.size();i++) {
final SegmentInfo info = segmentInfos.info(i);
List files = info.files();
for(int j=0;j<files.size();j++)
synced.add(files.get(j));
}
}
this.autoCommit = autoCommit; //執行提交寫入索引的標志
setRollbackSegmentInfos(segmentInfos); //克隆原來的segment狀態信息,并且將信息保存到HashSet。
docWriter = new DocumentsWriter(directory, this); //創建一個DocumentsWriter對象
docWriter.setInfoStream(infoStream); //設置DocumentsWriter對象的infoStream信息
docWriter.setMaxFieldLength(maxFieldLength); //設置DocumentsWriter對象的maxFieldLength信息
//默認的刪除策略實現類為KeepOnlyLastCommitDeletionPolicy,它只是保證將最近提交刪除的索引文件,提交刪除動作
// IndexFileDeleter deleter是IndexWriter類的一個私有的成員變量,它在org.apache.lucene.index包里面,主要對刪除索引文件進行實現和管理
deleter = new IndexFileDeleter(directory,
deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy,
segmentInfos, infoStream, docWriter);
pushMaxBufferedDocs(); //刷新DocsBuffer。
if (infoStream != null) { //如果infoStream是null
message("init: create=" + create);
messageState();
}
} catch (IOException e) {
this.writeLock.release();
this.writeLock = null;
throw e;
}
}
通過IndexWrite的構造函數,以及最終的實現方法的init分發,其主要是實現了根據指定的建立索引的方式(重寫、追加寫入),通過create標志位來判斷,從而指定一種在操作索引文件的過程中刪除索引文件的策略。
在理解lucene的時間,必須熟悉其初始化IndexWrite的原理,才能深入了解該框架在創建索引的核心實現機制。