2016-05-21 3 views
2

В моем экземпляре sitecore у меня есть контент для 2 шаблонов, Продукт и Категория продукта. В продуктах есть мультилиста, которые ссылаются на Категория продукта в качестве поисковых запросов. В продуктах также предусмотрена установка индексированных вычислений, которая предварительно вычисляет некоторые данные на основе выбранных категорий продуктов. Поэтому, когда пользователь меняет Продукт, стратегия индексации Sitecore индексирует Продукт с вычисленным полем.Sitecore: программно инициировать переиндексацию связанного контента

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

Благодаря

ответ

1

Одним из способов было бы добавить пользовательский OnItemSave обработчик, который будет проверять, если шаблон измененного элемента имеет шаблон ProductCategory и будет проблематично инициировать обновление индекса.

Чтобы только проиндексировать измененные элементы, вы можете пикап сопутствующих продуктов и зарегистрировать их в HistoryEngine с помощью HistoryEngine.RegisterItem метода:

Sitecore.Context.Database.Engines.HistoryEngine.RegisterItemSaved(myItem, new ItemChanges(myItem));

Некоторые полезные инструкции, как создать OnItemSave обработчик можно найти здесь : https://naveedahmad.co.uk/2011/11/02/sitecore-extending-onitemsave-handler/

+0

как это будет работать с веб-базой данных/CD? Используя ваше решение, после умного опубликования, onItemSave не будет запущен в ProductCategories – webber

+0

Да, но вы используете OnItemSave только для регистрации изменений в файле истории Sitecore. Должна ли интеллектуальная публикация выбирать и запускать reindex? –

+0

Мне нравится ваше предложение, особенно как его так легко. Я сделаю это и дам вам знать, как это работает! – webber

0

Вы можете добавить или изменить одну из существующих стратегий обновления индекса. (конфигурация \ Sitecore \ contentSearch \ indexConfigurations \ indexUpdateStrategies конфигурации узла)

В качестве примера можно взять

Sitecore.ContentSearch.Maintenance.Strategies.SynchronousStrategy

Одна вещь, что вам нужно для изменения

public void Run(EventArgs args, bool rebuildDescendants) 

способ. args содержит замененный элемент ссылки. Все, что вам нужно, инициирует обновление индекса для связанных элементов.

После создания собственной стратегии обновления вы должны добавить ее в свой индекс, стратегии узел конфигурации.

3

Вы можете достичь с помощью трубопровода indexing.getDependencies. Добавьте к нему процессор - ваш пользовательский класс должен состоять из Sitecore.ContentSearch.Pipelines.GetDependencies.BaseProcessor и переопределить Process(GetDependenciesArgs context).

В этой функции вы можете получить свой IndexedItem и добавить на основе этой информации другие элементы в зависимости. Эти зависимости также будут индексированы. Преимущество этого способа работы заключается в том, что зависимые элементы будут индексироваться в одном и том же задании, вместо того, чтобы вызывать новые задания для их обновления.

Просто помните, что это может привести к плохой работе, поскольку этот код будет вызываться для всех индексов. Выйдите из функции, как только сможете, если не применимы.

Некоторые известные проблемы об этом трубопроводе можно найти на kb.

+0

Moe info здесь: http://ggullentops.blogspot.be/2016/06/sitecore-index-dependencies.html – Gatogordo

Смежные вопросы