1

一个ScoreDoc[]数组包含来自搜索的所有文档 ID。我想使用这些文档 ID 来更新单个文档。在这种特殊情况下,我无法唯一标识我希望更新的行,因为给定的术语将导致匹配多个文档。

想象一个查询,其中返回 1:a、2:b 和以下文档

       1 2 3 4 5 6
doc 1: a b c d e f
doc 2: a b g h i j
doc 3: a b k l m n

我基本上是对字段 3 和 4 进行更新,但希望保持 5 和 6 不变。

目前我可以抓取这些行,进行我想要的更新,但我想不出在索引中更新它们的方法。

一个indexWriter.updateDocuments(...)或一个indexwriter.DeleteDocuments(...)将导致文档 1、2 3 被删除。

由于我有 documentId,我认为有一种方法可以让我用它来更新索引。

4

2 回答 2

6

Lucene 不允许更新文档中的字段。它严格来说是一种删除/添加机制。

文档的 docId 可以在优化、合并等过程中更改,因此依赖它始终保持不变并不是您想要做的事情。您应该将自己的字段放入不会随时间变化的文档中,并改用它。

于 2013-10-04T18:21:16.850 回答
1

有一种方法可以通过 docid 删除:IndexWriter.tryDeleteDocument。删除文档后,您可以添加新文档,正如其他人所说,这是 Lucene 执行更新的方式。

上面链接的文档提供了一些有趣的信息,说明为什么它被称为try DeleteDocument

于 2013-10-04T22:28:35.970 回答