1

我正在使用 lucene.net。我正在编写一个代码,它应该在一段时间后索引同一个文件夹。如果该文件夹中的内容已被索引,我如何重新索引?假设我索引了 4 个文档。5分钟后,任何文件都没有变化,那么如何管理这种情况?另外我想知道如果最近更新了其中一个文件,那么我如何通过替换或删除相同的旧索引来仅 REINDEX 备份该文件?

4

2 回答 2

1

只需将每个文件的时间戳或 CRC 存储在某处(即数据库)。

然后,您抓取文件系统并仅更新使用更改的文件,使用IndexWriter.UpdateDocument()添加新文件IndexWriter.AddDocument()并删除不再存在的文件IndexWriter.DeleteDocument()

于 2012-12-13T15:22:50.963 回答
0

在现代版本的 Lucene.Net 中,您可以将键作为文档的一部分进行索引,然后根据键修剪现有索引:

var document = new Document()
{
  new StringField("DocumentId", source.DocumentId, Field.Store.YES),
  new StringField("DocumentPath", source.DocumentPath, Field.Store.YES),
  new TextField("Content", source.Text, Field.Store.NO),
  new TextField("Tags", source.Tags, Field.Store.YES),
};

...

var writer = GetIndexWriter();

// Delete existing records
var query = new BooleanQuery
{
  {new TermQuery(new Term("DocumentId", source.DocumentId)), Occur.MUST},
  {new TermQuery(new Term("DocumentPath", source.DocumentPath)), Occur.MUST},
};
writer.DeleteDocuments(query);

// Add new document
writer.AddDocument(document);

例如,您还可以将上次更新时间戳存储为索引的一部分,并使用它来确定何时重新索引文件。

绝对不需要为此使用外部数据库。

注意:您应该使用StringFieldthis 而不是TextField,以便您可以匹配复杂的键;IE。ATextField可能会将 ABC-DEF 之类的 id 转换为标记 ABC 和 DEF,因此对于ABC-DEF.

于 2021-04-07T08:11:08.660 回答