Sitecore Lucene:在更新项目时重新索引子项(或父项)

san*_*erd 6 database lucene indexing sitecore web-crawler

情况

我有以下Sitecore Lucene配置:

  • 新索引,type ="Sitecore.Search.Index,Sitecore.Kernel"
  • 包含两个抓取工具(一个自定义抓取工具,可添加额外的"计算"字段)
  • 每个爬网程序处理其特定模板GUID,因为它们包含不同的计算字段

问题

计算的字段基于父/子字段.如何设置Sitecore中的Lucene,只是在索引中更新了实际更改项目的文档.

因此,不更新其他文档上的计算字段(这些字段是必需的,这些字段上存在搜索条件).

是否有可能手动触发索引中其他项的更新?
我已经研究过继承Sitecore.Search.Index,但没有一个相关的方法是虚拟的.

此外,我尝试订阅IndexingProvider-events:
public event EventHandler OnRemoveItem;
公共事件EventHandler OnRemoveVersion;
公共事件EventHandler OnUpdateItem;

这背后的想法是在DatabaseCrawler中触发需要更新的其他项目的OnUpdateItem事件,但是您无法从IndexingProvider外部触发此事件.

有没有办法在不进行完全重建的情况下触发索引更新,这不涉及保存/重新发布其他项目?

谢谢!
桑德

tec*_*414 4

索引更新是通过 HistoryEngine 触发的,其事件和方法是公共的,因此您可以利用历史引擎上的事件处理程序来检测何时发生需要重新索引的更改,然后将其他条目添加到父级/的历史记录中您还需要重新索引子项目。

Sitecore.Data.Managers.IndexingManager.InitializeEventHandlers()有一个将处理程序附加到HistoryEngine数据库的示例。

那么你的处理程序逻辑将是这样的

protected void HistoryEngine_AddedEntry(object sender, HistoryAddedEventArgs e)
{
    Item item = e.Database.GetItem(e.Entry.ItemId);
    //TODO: Add logic to make sure e.Entry.ItemId requires a parent/child reindex as well
    //TODO: Make sure that logic also prevents excessive or infinite recursion since we'll be triggering the AddedEntry event again below
    Item parent = item.Parent;
    //RegisterItemSaved doesn't appear to do anything with its second argument
    e.Database.Engines.HistoryEngine.RegisterItemSaved(parent, null);
}
Run Code Online (Sandbox Code Playgroud)

连接它的最佳位置可能是在initialize管道中。

注意,这是一个未经测试的想法,请报告您的结果!