例如,如何更新lucene.net索引中的字段而不是更新所有索引

时间:2017-05-23 14:24:01

标签: c# api indexing lucene.net

我在网络Api中使用Lucene.net创建搜索引擎,我找到了一个CRUD  像这样的更新索引的代码

Colleague(s)
它就像删除旧索引后添加新索引一样,但我只是想更新字段并将其添加到旧索引中,而我不知道如何返回api控制器关于更新索引,那么是否有人可以给我给它一些提示或更好的给我看演示。我将感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

AFAIK,你不能。但是,有一种更方便的方法UpdateDocument(Term, IEnumerable<IIndexableField>)

else if (book.IT == IndexType.Modify)
{
    document.Add(new Field("id", book.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.Add(new Field("title", book.Title, Field.Store.YES, Field.Index.ANALYZED,
                           Field.TermVector.WITH_POSITIONS_OFFSETS));
    document.Add(new Field("content", book.Starring, Field.Store.YES, Field.Index.ANALYZED,
                           Field.TermVector.WITH_POSITIONS_OFFSETS));
    writer.UpdateDocument(new Term("id", book.ID.ToString()), document);
}

索引并不是一个数据库,它是一个可以添加数据以使其非常快进行搜索的位置。

要利用WebApi的更新功能,您可以捎带数据库更新(更新数据库中的字段,从数据库读取整个记录,更新索引)。或者,如果您不需要实时执行搜索,则可以定期更新批处理中的索引。

如果您的数据更新速度非常快,并且您想对实时数据进行搜索,则有以下几种选择:

  1. 使用IndexWriter提供的Near Real-time Search functionality以及实时更新索引。
  2. 如果您愿意受到性能影响,可以继承Directory并直接从数据库中读取数据。其他人已经完成了一些实施(您可以直接使用或反向工程) - LuceneNetSqlDirectoryNuGet)和AzureDirectoryNuGet)。如果以这种方式执行此操作,则只需以传统方式更新数据源中的数据即可。