lucene中的删除索引

今天在测试lucene的删除索引中遇到一个问题
测试代码如下:
。。。。。。。

protected void setUp() throws Exception ... {
super.setUp();
deleteIndexBuilder
=(DeleteIndexBuilder)CTX
.getBean(
"deleteIndexBuilder");

addIndexBuilder
=(AddIndexBuilder)CTX.getBean("addIndexBuilder");
addIndexBuilder.getConstant().setCreateAble(
true);
addIndexBuilder.buildIndex();

}


。。。。。。。

public void testDeleteIndex() throws Exception ... {

//代码段1
IndexReaderreader2=IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());

assertEquals(
23,reader2.numDocs());
reader2.close();

//代码段2
deleteIndexBuilder.buildIndex();

//代码段3
IndexReaderreader3=IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());

assertEquals(
13,reader3.numDocs());
reader3.close();

}

在测试中,首先重建索引(见setup方法),在测试方法中可以看出

1) 删除前有23个doc(见代码段1)
2) 删除索引(共10个doc,见代码段2)
3) 删除后有13个doc(见代码段3)

第一次执行,没问题,第二次执行就发现代码段1处出现断言错误,说该处此刻只有13个doc

后来发现原来使用IndexReader.deleteDocuments 方法就算调用了IndexReader.close也并不删除doc,这与lucene in action(page 33)中的说法有些出入
Documentdeletionisdoneusingaclassthatissomewhatinappropriately
calledIndexReader.Thisclassdoesn’tdeleteDocumentsfromtheindeximmediately.
Instead,itmarksthemasdeleted,waitingfortheactualDocumentdeletion
untilIndexReader’sclose()methodiscalled.

我想也许是lucene版本不一样的原因.

其实使用lucene删除,lucene会做好删除标记直到你调用IndexWriter.optimize()才真正从库中删除.

出现上面测试所遇到的问题正是因为在重建索引时才真正删除doc,这样的话就与断言的23不符合,测试失败

lucene的这种删除方式似乎也不大会影响你的应用,就算没有从库中删除,你也搜索不到这个
doc了,至于是不是要在删除索引的时候添上IndexWriter.optimize()以及IndexWriter.close()这样的代码视情况而定.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值