我正在使用 lucene.net。我正在编写一个代码,它应该在一段时间后索引同一个文件夹。如果该文件夹中的内容已被索引,我如何重新索引?假设我索引了 4 个文档。5分钟后,任何文件都没有变化,那么如何管理这种情况?另外我想知道如果最近更新了其中一个文件,那么我如何通过替换或删除相同的旧索引来仅 REINDEX 备份该文件?
问问题
806 次
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);
例如,您还可以将上次更新时间戳存储为索引的一部分,并使用它来确定何时重新索引文件。
绝对不需要为此使用外部数据库。
注意:您应该使用StringField
this 而不是TextField
,以便您可以匹配复杂的键;IE。ATextField
可能会将 ABC-DEF 之类的 id 转换为标记 ABC 和 DEF,因此对于ABC-DEF
.
于 2021-04-07T08:11:08.660 回答