我是Lucene.NET的新手,但我正在使用为an open source tool构建的Sitecore CMS,它使用Lucene.NET来索引来自CMS的大量内容。我昨天确认,当我重建我的索引时,当前索引文件擦除干净,所以任何依赖于索引的东西都没有大约30-60秒的数据(完整索引重建的时间)。是否有最佳实践或方法使Lucene.NET在完全重建新索引之前不会覆盖当前索引文件?我基本上以为我想要写入新的临时索引文件,当重建完成时,这些文件会覆盖当前索引。
我在谈论的例子:
提前致谢
答案 0 :(得分:6)
我没有“Sitecore”本身的经验,但这是我的故事。
我们最近将基于索引的搜索(使用Lucene.Net)整合到我们的电子商务子系统中。我们案例的索引更新过程可能需要大约半个小时(大约50,000个产品本身+大量相关信息)。为了防止在更新索引期间出现“拒绝服务”响应,我们首先创建它的“备份”版本(只需将索引目录复制到另一个位置),所有进一步的请求都被重定向到使用此“备份”版本。索引更新完成后,我们删除备份,以便客户端开始使用索引的更新(或“实时”)版本。如果在更新过程中可能发生任何未处理的异常,这也有帮助,因为您可能最终处于根本没有索引的情况下(在我们的情况下,客户端总是可以使用“备份”版本)。
Lucene.Net.Index.IndexWriter
对象的API reference(Lucene 2.4)声明如下:
请注意,您可以使用打开索引
create=true
即使是读者也是如此 使用索引。老读者会 继续搜索“时间点” 他们已打开的快照,但不会 看到新创建的索引,直到它们 重新打开。
所以至少你不应该担心目前在索引中搜索的客户端。
希望这有助于您做出正确的决定。
答案 1 :(得分:1)
我不熟悉那个sitecore工具,但是我可以回答你如何用纯Lucene.Net做到这一点:你应该使用NRT设置,这意味着“有一个索引编写器,永远不会关闭它。“
基本上,索引编写器在内存中有一个“虚拟”索引,直到它被刷新到磁盘。因此,只要你从作者那里得到你的读者,你就会看到最新的东西,即使它还没有刷新到磁盘上。