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

时间:2011-01-07 14:44:58

标签: c# lucene lucene.net sitecore

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

我在谈论的例子:

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

提前致谢

2 个答案:

答案 0 :(得分:6)

我没有“Sitecore”本身的经验,但这是我的故事。

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

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

  

请注意,您可以使用打开索引   create=true即使是读者也是如此   使用索引。老读者会   继续搜索“时间点”   他们已打开的快照,但不会   看到新创建的索引,直到它们   重新打开。

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

希望这有助于您做出正确的决定。

答案 1 :(得分:1)

我不熟悉那个sitecore工具,但是我可以回答你如何用纯Lucene.Net做到这一点:你应该使用NRT设置,这意味着“有一个索引编写器,永远不会关闭它。“

基本上,索引编写器在内存中有一个“虚拟”索引,直到它被刷新到磁盘。因此,只要你从作者那里得到你的读者,你就会看到最新的东西,即使它还没有刷新到磁盘上。