1. 程式人生 > >Lucene筆記08-Directory的幾種操作方式

Lucene筆記08-Directory的幾種操作方式

一、IndexReader的刪除操作

IndexReader也可以執行刪除操作,使用IndexReader執行的刪除操作不需要重新獲取IndexReader物件了。使用IndexReader刪除的前提是,在建立IndexReader物件的時候,要設定它的readonly為false。

indexReader = IndexReader.open(directory,false);
indexReader.deleteDocuments(new Term("id", "1"));

不過還是建議使用IndexWriter物件來執行刪除操作,下面列舉一下使用IndexReader執行刪除操作可能存在的問題:

  1. 當有一個IndexWriter開啟的時候,IndexReader的刪除操作是不能夠進行的,會報LockObtainFailedException。
  2. 當IndexReader被多個執行緒使用的時候,一個執行緒用其進行刪除,會使得另一個執行緒看到的索引有所改變,使得另一個執行緒的結果帶有不確定性。
  3. 對於更新操作,在Lucene中是先刪除,再新增的,然而刪除的被立刻看到的,而新增卻不能夠立刻看到,造成了資料的不一致性。
  4. 即便以上問題可以通過鎖來解決,然而背後的操作影響到了搜尋的速度,是我們不想看到的。

二、Directory的介紹

Directory下面有4個類:FileSwitchDirectory,FSDirectory,NRTCacheDirectory,RAMDirectory。

FSDirectory:FSDirectory又有3個實現類:SimpleFSDirectory,NOIFSDirectory,MMapDirectory,它們各自有各自的使用場景。使用FSDirectory.open(),由open()方法自動進行選擇。

RAMDirectory:將索引資訊儲存到記憶體中,優點是速度快,缺點是不能持久化。

具體使用哪一種方式就根據具體的業務需求了。