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
        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.

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值