2011-05-12 51 views
2

我正在接管一个项目,所以我仍然在学习这一点。该项目使用Lucence.NET。我也不知道这个功能是否正确。无论如何,我实例:Lucene.NET - 无法使用IndexWriter删除文档

var writer = new IndexWriter(directory, analyzer, false); 

对于具体的文件,我打电话:

writer.DeleteDocuments(new Term(...)); 

最后,我打电话通常writer.Optimize(),writer.Commit() ,和writer.Close()。

Term对象中的字段是Guid,转换为字符串(.ToString(“D”)),并存储在文档中,使用Field.Store.YES和Field.Index.NO。

但是,通过这些设置,我似乎无法删除这些文档。目标是删除,然后添加更新的版本,以便获取同一文档的重复内容。如果需要,我可以提供更多的代码/解释。有任何想法吗?谢谢。

回答

7

该字段必须编入索引。如果一个字段没有编入索引,它的条款将不会在枚举中显示。

+0

我做了一些更多的研究后,我意识到并测试了这个。我为列编制索引,重建它,现在文档正确地被删除。谢谢。 – 2011-05-12 17:34:30

+0

我看到了同样的问题,但我不明白你的意思是“该字段必须编入索引”。你能澄清一下吗? – 2013-04-05 18:30:23

4

我不认为你如何处理作者有什么问题。

听起来好像您传递给DeleteDocuments的术语没有返回任何文档。你是否尝试过使用相同的术语来查询它是否返回任何结果?

另外,如果你的目标是重新创建简单的文档,你可以调用UpdateDocument:

//  Updates a document by first deleting the document(s) containing term and 
//  then adding the new document. The delete and then add are atomic as seen 
//  by a reader on the same index (flush may happen only after the add). NOTE: 
//  if this method hits an OutOfMemoryError you should immediately close the 
//  writer. See above for details. 

您可能还需要检查出SimpleLucene(http://simplelucene.codeplex.com) - 它使做基本的Lucene任务有点容易。

[更新] 不知道我错过了它,但@Shashikant Kore是正确的,你需要确保该字段是索引,否则你的术语查询将不会返回任何东西。

+0

我不能赞扬你们两个,我可以吗? – 2011-05-12 17:34:59