4

一位同事问了这个问题,我没有立即找到解决方案,所以我在这里发布。他以编程方式在主数据库中插入一个 Sitecore 项目,然后必须插入另一个项目,该项目依赖于索引中存在的第一个项目。他最初每两次插入第二个项目都会失败,但后来在他的代码中插入了一个手动暂停以尝试让索引时间赶上,现在它大约每十次失败一次。更好,但并不完美。

他正在寻找是否有 Sitecore 方法来检查索引是否已更新,然后再继续插入相关项。

我确实找到了 Alex Shyba 的这篇博文(http://sitecoreblog.alexshyba.com/2011/04/search-index-troubleshooting.html),看起来它可能有一些适用性,但我的同事正在严格地工作master DB(不涉及发布),并且我们已经在我们的解决方案中实现了 Alex 文章中的前几个步骤(我没有完成整个事情)。

4

3 回答 3

2

如果您依赖于索引添加,最终确保项目在索引中的唯一方法是在异步索引更新之后执行操作。在 Sitecore 6 中,我知道的唯一方法是database:propertychanged event. Alex Shyba 在另一篇关于 HTML 缓存清除的文章中描述了此事件。

您的挑战可能是在事件处理程序中知道插入了什么项目,以及如何处理它。您将需要某种全局数据结构来传达此状态信息,因为索引更新作为异步作业运行。

其他选项(可能更容易)是删除对索引更新的依赖(使用 Sitecore 查询或快速查询),或者轮询索引直到项目存在(这有点难看)。

于 2013-03-26T14:02:26.787 回答
2

为什么不自己将项目添加到索引中?这样,用户界面将被阻止,直到完成。

您可以通过挂钩 item:saved 事件来做到这一点。我认为事件处理程序将基于数据库爬虫的代码

于 2013-03-26T22:19:38.887 回答
0

您是否考虑过将第二个任务作为“定时任务”排队,并使用一些包装器来检查依赖关系并在必要时重新排队?请参阅http://www.sitecore.net/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2010/11/All-About-Sitecore-Scheduling-Agents-and-Tasks.aspx

于 2013-03-27T16:28:16.120 回答