Lucene筆記08-Directory的幾種操作方式
阿新 • • 發佈:2018-11-04
一、IndexReader的刪除操作
IndexReader也可以執行刪除操作,使用IndexReader執行的刪除操作不需要重新獲取IndexReader物件了。使用IndexReader刪除的前提是,在建立IndexReader物件的時候,要設定它的readonly為false。
indexReader = IndexReader.open(directory,false);
indexReader.deleteDocuments(new Term("id", "1"));
不過還是建議使用IndexWriter物件來執行刪除操作,下面列舉一下使用IndexReader執行刪除操作可能存在的問題:
- 當有一個IndexWriter開啟的時候,IndexReader的刪除操作是不能夠進行的,會報LockObtainFailedException。
- 當IndexReader被多個執行緒使用的時候,一個執行緒用其進行刪除,會使得另一個執行緒看到的索引有所改變,使得另一個執行緒的結果帶有不確定性。
- 對於更新操作,在Lucene中是先刪除,再新增的,然而刪除的被立刻看到的,而新增卻不能夠立刻看到,造成了資料的不一致性。
- 即便以上問題可以通過鎖來解決,然而背後的操作影響到了搜尋的速度,是我們不想看到的。
二、Directory的介紹
Directory下面有4個類:FileSwitchDirectory,FSDirectory,NRTCacheDirectory,RAMDirectory。
FSDirectory:FSDirectory又有3個實現類:SimpleFSDirectory,NOIFSDirectory,MMapDirectory,它們各自有各自的使用場景。使用FSDirectory.open(),由open()方法自動進行選擇。
RAMDirectory:將索引資訊儲存到記憶體中,優點是速度快,缺點是不能持久化。
具體使用哪一種方式就根據具體的業務需求了。