今天在测试lucene的删除索引中遇到一个问题
测试代码如下:
在测试中,首先重建索引(见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()这样的代码视情况而定.
测试代码如下:
。。。。。。。
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
IndexReader reader2 = IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());
assertEquals(23, reader2.numDocs());
reader2.close();
//代码段2
deleteIndexBuilder.buildIndex();
//代码段3
IndexReader reader3 = IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());
assertEquals(13, reader3.numDocs());
reader3.close();
}
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
IndexReader reader2 = IndexReader.open(deleteIndexBuilder.getConstant()
.getIndexDir());
assertEquals(23, reader2.numDocs());
reader2.close();
//代码段2
deleteIndexBuilder.buildIndex();
//代码段3
IndexReader reader3 = 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)中的说法有些出入
Document deletion is done using a class that is somewhat inappropriately
called IndexReader. This class doesn’t delete Documents from the index immediately.
Instead, it marks them as deleted, waiting for the actual Document deletion
until IndexReader’s close() method is called.
called IndexReader. This class doesn’t delete Documents from the index immediately.
Instead, it marks them as deleted, waiting for the actual Document deletion
until IndexReader’s close() method is called.
我想也许是lucene版本不一样的原因.
其实使用lucene删除,lucene会做好删除标记直到你调用IndexWriter.optimize()才真正从库中删除.
出现上面测试所遇到的问题正是因为在重建索引时才真正删除doc,这样的话就与断言的23不符合,测试失败
lucene的这种删除方式似乎也不大会影响你的应用,就算没有从库中删除,你也搜索不到这个
doc了,至于是不是要在删除索引的时候添上IndexWriter.optimize()以及IndexWriter.close()这样的代码视情况而定.