Sitecore Lucene: переиндексировать дочерние (или родительские) элементы при обновлении элемента - PullRequest
6 голосов
/ 24 ноября 2011

Положение

У меня есть следующая конфигурация Sitecore Lucene:

  • Новый индекс, type = "Sitecore.Search.Index, Sitecore.Kernel"
  • Содержит два сканера (пользовательский сканер, который добавляет дополнительные «вычисляемые» поля)
  • Каждый сканер обрабатывает свой определенный GUID шаблона, поскольку они содержат разные вычисляемые поля

Задача

Рассчитанные поля основаны на полях parent / child . Кажется, что Lucene в Sitecore настроен так, что в документе обновляются только те документы для элементов, которые были фактически изменены .

Как таковые, рассчитанные поля в других документах (обязательные, в этих полях есть условия поиска) не обновляются.

Вопрос

Есть ли возможность вручную запустить обновление других элементов в индексе?
Я изучил наследование Sitecore.Search.Index, но ни один из соответствующих методов не является виртуальным.

Также я попытался подписаться на IndexingProvider-events:
открытое событие EventHandler OnRemoveItem;
открытое событие EventHandler OnRemoveVersion;
открытое событие EventHandler OnUpdateItem;

Идея заключалась в том, чтобы вызвать событие OnUpdateItem в DatabaseCrawler для других элементов, которые необходимо обновить, но вы не можете вызвать это событие извне IndexingProvider.

Есть ли способ вызвать обновление индекса без полной перестройки, что не требует сохранения / повторной публикации этих других элементов?

Спасибо!
Sander

1 Ответ

4 голосов
/ 28 ноября 2011

Обновление индекса запускается через 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);
}

Лучшее место для прикрепления это, вероятно, в конвейере initialize.

N.B. это непроверенная идея, пожалуйста, сообщите о своих результатах!

...