Lucene知识小总结4:索引的反删除

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();
		}
	}

执行结果截图

230343_lowJ_1417419.png

二、下面代码使用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();
			}
		}
	}

运行报错

230735_9RZa_1417419.png

把”writer.close();“的注释去掉再运行

230832_Veci_1417419.png

查阅资料,可以作为借鉴的解析:

    如果你试图通过IndexReader删除文档,需要记住:Lucene只允许一个writer打开一次。实施删除操作的IndexReader此时只能算作一个writer。这意味着在使用IndexReader进行删除操作之前必须关闭已打开的任何IndexWriter,反之亦然。

转载于:https://my.oschina.net/heroShane/blog/202348

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值