今天在测试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()这样的代码视情况而定.
测试代码如下:





































在测试中,首先重建索引(见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)中的说法有些出入




我想也许是lucene版本不一样的原因.
其实使用lucene删除,lucene会做好删除标记直到你调用IndexWriter.optimize()才真正从库中删除.
出现上面测试所遇到的问题正是因为在重建索引时才真正删除doc,这样的话就与断言的23不符合,测试失败
lucene的这种删除方式似乎也不大会影响你的应用,就算没有从库中删除,你也搜索不到这个
doc了,至于是不是要在删除索引的时候添上IndexWriter.optimize()以及IndexWriter.close()这样的代码视情况而定.