避免在重建期间删除当前的Lucene.NET索引

Mar*_*ino 12 c# lucene lucene.net sitecore

我是Lucene.NET的新手,但我使用的Sitecore CMS构建的开源工具,它使用Lucene.NET来索引来自CMS的大量内容.我昨天确认,当我重建我的索引时,当前索引文件擦除干净,所以任何依赖于索引的东西都没有大约30-60秒的数据(完整索引重建的时间).是否有最佳实践或方法使Lucene.NET在完全重建新索引之前不会覆盖当前索引文件?我基本上认为我希望它写入新的临时索引文件,当重建完成时,这些文件会覆盖当前索引.

我在说什么的例子:

  • 建立新的指数(约30秒)
  • 索引有大约500个文件
  • 使用代码访问索引中的数据并在网站上显示
  • 重建指数(~30秒)
    • 现在读取数据索引的任何代码都不会返回任何内容,因为索引文件被覆盖了; 导致网站未显示任何数据
  • 重建完成:数据现在再次可用,数据返回网站

提前致谢

vol*_*pav 6

我没有"Sitecore"本身的经验,但这是我的故事.

我们最近将基于索引的搜索(使用Lucene.Net)整合到我们的电子商务子系统中.我们案例的索引更新过程可能需要大约半个小时(大约50,000个产品本身+大量相关信息).为了防止在更新索引期间出现"拒绝服务"响应,我们首先创建它的"备份"版本(只需将索引目录复制到另一个位置),所有进一步的请求都被重定向到使用此"备份"版本.索引更新完成后,我们删除备份,以便客户端开始使用索引的更新(或"实时")版本.如果在更新过程中可能发生任何未处理的异常,这也有帮助,因为您可能最终处于根本没有索引的情况下(在我们的情况下,客户端总是可以使用"备份"版本).

该对象的API参考(Lucene 2.4)Lucene.Net.Index.IndexWriter声明如下:

请注意,create=true即使读者正在使用索引,您也可以打开 索引.旧读者将继续搜索他们打开的"时间点"快照,并且在重新打开之前不会看到新创建的索引.

所以至少你不应该担心目前在索引中搜索的客户端.

希望这能帮助您做出正确的决定.