译自:原文地址
IndexWriter允许你以Term或者Query检索文档,然后删除它们。删除操作会被缓存,周期更新到索引中,如果commit()或者close()调用后改变会立刻可以看到。
IndexReader也可以删除文档,根据Term或者文档编号,但是如果你要用IndexReader对索引做出改变,必须首先关闭所有打开的IndexWriter。IndexReader也会缓存删除,直到调用close()的时候才会真正写入改变,但是如果你使用同一个IndexReader进行搜索,那么缓存了的删除也会立刻可见。与 IndexWriter的删除方法不同,IndexReader的删除方法会返回删除掉的文档的数目。
一般来说最好使用IndexWriter的删除方法,除非 1)你必须按照文档号删除, 2)你需要搜索立刻可以看到删除的结果, 或者 3)你必须知道一个deleteDocuments方法删除掉的文档的数目。
如果你必须按照文档号删除文档,但是还非要用IndexWriter,那么一个常见的方法是构建一个主键字段,为每个文档保存一个不重复的ID字符串。然后你可以用包含ID的Term来选择单个文档,然后传递给IndexWrriter的deleteDocuments(term)方法来删除它。
文档一旦被删除,就不会在termDocs和TermPositions中,以及任何搜索结果中出现了。试图载入这个文档会引发一个异常。但是这个文档仍旧会影响docFreq状态,从而影响搜索的评分,这个问题最后会在包含删除的段被合并的时候得以纠正。
所属分类:
[lucene]
[Java]
tag:
删除,
索引,
tinyfool发布于2009年10月30日 15:43
最后更新于2009年10月30日 16:39