2009-10-16 54 views
3

从Lucene索引中删除旧文档的惯用方法是什么?如何从Lucene/Lucene.NET中删除旧文档

我对所有文件的日期字段(YYYYMMDDHHMMSS),我想删除任何东西比日龄(例如)以上。

我应该进行过滤的搜索或通过的IndexReader的文件列举?

我敢肯定,问题是无论哪个相同的Lucene的平台上运行。

谢谢!

回答

3

搜索年月日*将正常运行当前日期存储为文本字符串。一旦你有结果,你可以使用IndexReader.delete删除你不感兴趣的文档。在我看来,这是实现这一目标的最佳方式。

+0

我用这种方法看到的一个问题是,当有超过1024个旧文档时,我会得到一个“TooManyClauses”异常。 –

+0

这真的取决于你的实现。我需要知道具体细节,但作为一般规则,您可以删除这些搜索警告,因为它们只是维护(通过设置更高的最大子句数),或者进行更具体的搜索(YYMMddhh *等)。再次,都取决于你的环境和实施。 – synhershko

+0

我最终通过使用MatchAllDocsQuery和RangeFilter对此进行了轻微的变化。似乎到目前为止工作正常... –

2

您可以尝试使用Lucene的低级API。

获取期限枚举从与“YYYY”一词指数。迭代术语统计员以获得术语。如果该术语的文本不与当前日期(或上一个日期)相关,请使用该术语调用IndexReader.deleteDocuments(术语)。

既然你不使用查询对象,你不会得到搜索相关的异常。