Lucene知识小总结4:索引的反删除
生活随笔
收集整理的這篇文章主要介紹了
Lucene知识小总结4:索引的反删除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
IndexReader提供了一個有時非常有用的方法undeleteAll,該方法能反向操作索引中所有被掛起的刪除。需要注意的是,該方法只能對還未進行段合并的文檔進反刪除操作。該方法之所以能夠實現反刪除操作,是因為IndexWriter只能將刪除文檔標志為刪除狀態,但事實上并未真正移除這些文檔,最終的刪除操作是在該文檔所對應的段進行合并時才執行的。(以上文字摘自《Lucene 實戰》)
一、下面代碼使用reader進行刪除
public?void?delete02()?{try?{reader?=?IndexReader.open(directory,false);reader.deleteDocuments(new?Term("id","1"));System.out.println("numDocs:"+reader.numDocs());System.out.println("maxDocs:"+reader.maxDoc());System.out.println("deleteDocs:"+reader.numDeletedDocs());System.out.println("=============");reader.undeleteAll();System.out.println("numDocs:"+reader.numDocs());System.out.println("maxDocs:"+reader.maxDoc());System.out.println("deleteDocs:"+reader.numDeletedDocs());reader.close();}?catch?(CorruptIndexException?e)?{e.printStackTrace();}?catch?(LockObtainFailedException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}}執行結果截圖
二、下面代碼使用writer進行刪除
public?void?delete()?{IndexWriter?writer?=?null;try?{reader?=?IndexReader.open(directory,false); writer?=?new?IndexWriter(directory,new?IndexWriterConfig(Version.LUCENE_35,new?StandardAnalyzer(Version.LUCENE_35)));//參數是一個選項,可以是一個Query,也可以是一個term,term是一個精確查找的值//此時刪除的文檔并不會被完全刪除,而是存儲在一個回收站中的,可以恢復//writer.deleteDocuments(new?Term("id","1"));writer.deleteDocuments(new?Term("id","1"));writer.commit();System.out.println("numDocs:"+reader.numDocs());System.out.println("maxDocs:"+reader.maxDoc());System.out.println("deleteDocs:"+reader.numDeletedDocs());reader.close();reader?=?IndexReader.open(directory,false);System.out.println("=============");System.out.println("numDocs:"+reader.numDocs());System.out.println("maxDocs:"+reader.maxDoc());System.out.println("deleteDocs:"+reader.numDeletedDocs());System.out.println("=============");//writer.close();reader.undeleteAll();System.out.println("numDocs:"+reader.numDocs());System.out.println("maxDocs:"+reader.maxDoc());System.out.println("deleteDocs:"+reader.numDeletedDocs());reader.close();}?catch?(CorruptIndexException?e)?{e.printStackTrace();}?catch?(LockObtainFailedException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?finally?{try?{if(writer!=null)?writer.close();}?catch?(CorruptIndexException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}}}運行報錯
把”writer.close();“的注釋去掉再運行
查閱資料,可以作為借鑒的解析:
????如果你試圖通過IndexReader刪除文檔,需要記住:Lucene只允許一個writer打開一次。實施刪除操作的IndexReader此時只能算作一個writer。這意味著在使用IndexReader進行刪除操作之前必須關閉已打開的任何IndexWriter,反之亦然。
轉載于:https://my.oschina.net/heroShane/blog/202348
總結
以上是生活随笔為你收集整理的Lucene知识小总结4:索引的反删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与众不同 windows phone (
- 下一篇: IT小企的兴衰