为什么lucene 2.4中的'删除文档'不起作用?

时间:2009-09-01 08:21:04

标签: java lucene

我想用java删除lucene 2.4中的文档。我的代码是

  Directory directory = FSDirectory.getDirectory("c:/index");
  IndexReader indexReader = IndexReader.open(directory);
  System.out.println("num="+indexReader.maxDoc());
  indexReader.deleteDocuments(new Term("name","1"));
  System.out.println("num="+indexReader.maxDoc());

 output 
         num=1
         num=1     

2 个答案:

答案 0 :(得分:5)

在我看来,最好使用Indexwriter删除文档,因为Indexreader 缓冲删除,并且在调用close()之前不会对索引进行更改。除非您使用相同的参考资料进行搜索。

Lucene wiki

  

通常最好使用IndexWriter   删除,除非

     

您必须按凭证编号

删除      

您需要进行搜索   立即反映删除或

     

你必须知道有多少文件   被删除了一个给定的   deleteDocuments调用

我可以看到你想要内存中文档的maxdoc值,所以它是一个更好的方法来使用Indexwriter

所以问题的答案是

您应该关闭Indexreader对象或使用Indexwriter进行删除

答案 1 :(得分:3)

在使用maxDoc()优化索引之前,

IndexWriter不会更改。至少,您需要commit(),否则您的删除甚至可能永远不会进入磁盘。

但是,numDocs()应该在提交或优化之前返回未删除文档的数量。

使用IndexWriter添加和删除文档以及打开IndexReader只读文件可能是更好的做法(当然也不那么令人困惑); 3.0默认情况下会以只读方式打开它们。