2011-11-24 14 views
6

SytuacjaSitecore Lucene: re-index dziecko (lub dominującej) pozycji na aktualizację artykuł

Mam następujący Sitecore Lucene config:

  • nowy indeks, type = "Sitecore.Search.Index , Sitecore.Kernel”
  • zawiera dwa roboty (zwyczaj gąsienicowe, który dodaje dodatkowe pola«analizowany»)
  • Każdy robot obsługuje swój specyficzny szablon GUID, ponieważ zawierają one różne pola obliczone

Problem

Wyliczone pola są oparte na rodzic/dziecko dziedzinach. Wygląda na to, że wydaje się, że Lucene w Sitecore jest skonfigurowany, tylko te dokumenty, które zostały zmienione zostały zaktualizowane w indeksie.

Jako takie, pola wyliczone w innych dokumentach (które są wymagane, są warunki wyszukiwania w tych polach) nie są aktualizowane.

Pytanie

Czy istnieje możliwość, aby ręcznie wywołać aktualizację pozostałych pozycji w indeksie?
Przyjrzałem się dziedziczeniu Sitecore.Search.Index, ale żadna z odpowiednich metod nie jest wirtualna.

Próbowałem również zasubskrybować zdarzenia IndexingProvider:
publiczne wydarzenie EventHandler OnRemoveItem;
wydarzenie publiczne EventHandler OnRemoveVersion;
wydarzenie publiczne EventHandler OnUpdateItem;

Ideą tego było wyzwolenie zdarzenia OnUpdateItem w DatabaseCrawler dla innych elementów, które wymagają aktualizacji, ale nie można wywołać tego zdarzenia spoza IndexingProvider.

Czy istnieje sposób na wyzwolenie aktualizacji indeksu bez przeprowadzenia pełnej przebudowy, która nie obejmuje zapisywania/ponownego publikowania tych innych elementów?

Dzięki!
Sander

Odpowiedz

4

Aktualizacja Index jest wyzwalany przez HistoryEngine, którego zdarzenia i metody są publiczne, więc można potencjalnie wykorzystać moduł obsługi zdarzeń na silniku historii wykryć, kiedy następuje zmiana, która wymaga reindeksowania, a następnie dodać dodatkowe wpisy do historii dla elementów nadrzędnych/podrzędnych, które również wymagają reindeksowania.

Sitecore.Data.Managers.IndexingManager.InitializeEventHandlers() ma przykład dołączania programu obsługi do bazy danych w postaci HistoryEngine.

Wtedy twoja logika obsługi byłoby coś

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); 
} 

Najlepszym miejscem do mocowania jest to prawdopodobnie w initialize rurociągu.

N.B. to jest niesprawdzony pomysł, zgłoś ponownie swoje wyniki!

+0

Czy wyzwolenie HistoryEngine z dodatkowymi wpisami nie ma żadnych niepożądanych skutków ubocznych dla innych komponentów Sitecore? To brzmi jak rozsądne podejście, więc spróbuję to wkrótce. Niedługo odpowiem, najpierw muszę ukończyć inne zadania sprintu;) – sanderd

+1

Analiza w reflektorze pokazuje IndexingManager jako jedynego słuchacza dla HistoryEngine.AddedEntry, więc prawdopodobnie tam jesteś bezpieczny. Przypuszczam, że nie mogę zagwarantować, że jest to dowód na przyszłość. To powiedziawszy, wskazuje na to, że twój detektor AddEntry musi mieć logikę, aby zapobiec nieskończonej rekurencji. Dokona edycji. – techphoria414