2012-08-09 15 views
6

Ich spielte mit benutzerdefinierten Suchindizierungshandlern für SDL Tridion 2011 (GA) herum. Ich habe etwas funktioniert, mit der very helpful information provided by Arjen, aber ich bin mir nicht sicher, ob meine Ausführung die beste Option ist.Customized Tridion Search Index Handler: Benutzerdefinierte vs Standard-Feld für die Seite URL?

Die Anforderung besteht darin, nach Seiten im CMS nach URL suchen zu können (zB www.example.com/news/index.html). Um dies zu tun, habe ich eine Klasse erstellt mit der ISearchIndexingHandler Schnittstelle (Code unten). Ich indexiere die URL im ContentText-Feld des Elements, aber ich bin mir nicht sicher, ob dies normalerweise etwas anderes für eine Seite enthalten würde (ich denke, eine Seite hat nur Metadaten, also sollte das OK sein). Der Vorteil der Verwendung dieses über ein benutzerdefiniertes Feld ist, dass ich einfach die URL in das Suchfeld eingeben kann, ohne <URL> IN <Feldname> oder etwas ähnliches zu verwenden.

Also meine Frage ist, gibt es keinen Grund, ContentText für Pages nicht zu verwenden, und gibt es einen Vorteil bei der Verwendung eines benutzerdefinierten Felds? Auch Bonuspunkte kommen an alle, die gute Ideen zum Umgang mit BluePrinting haben (wenn ich eine Seite in einer übergeordneten Publikation erstelle, möchte ich, dass die lokalen URLs auch in den untergeordneten Publikationen indiziert werden) und der Fall, dass ein Strukturgruppenpfad geändert wird (Ich vermute, dass ich irgendwie einen Neu-Index von untergeordneten Seitenelementen in meinem Indizierungshandler auslösen kann).

Der Code:

using System; 
using Tridion.ContentManager.Search; 
using Tridion.ContentManager.Search.Indexing.Handling; 
using Tridion.ContentManager.Search.Indexing.Service; 
using Tridion.ContentManager.Search.Indexing; 
using Tridion.ContentManager.Search.Fields; 

namespace ExampleSearchIndexHandler 
{ 
    public class PageUrlHandler : ISearchIndexingHandler 
    { 
     public void Configure(SearchIndexingHandlerSettings settings) 
     {    
     } 

     public void ExtractIndexFields(IdentifiableObjectData subjectData, Item item, CoreServiceProxy serviceProxy) 
     { 
      PageData data = subjectData as PageData; 
      if (data != null) 
      { 
       PublishLocationInfo info = data.LocationInfo as PublishLocationInfo; 
       string url = GetUrlPrefix(data) + info.PublishLocationUrl; 
       item.ContentText = url; 
      } 
     } 

     private string GetUrlPrefix(PageData page) 
     { 
      //hardcoded for now, but will be read from publication metadata 
      return "www.example.com"; 
     } 
    } 
} 

Antwort

5

können Sie speichern die URL in der ContextText Property. Dieses Feld dient zum Indexieren von Vorlageninhaltsdaten.

Tridion indiziert keine freigegebenen Elemente der untergeordneten Publikation.

Indizierung wird bei Artikelmodifikation (Erstellen, Aktualisieren, Löschen, Lokalisieren und Entlo- kalisieren) ausgelöst. Oder Sie können das Reindexing-Tool verwenden, um Ihren Artikel neu zu indizieren. Es gibt jedoch keine Möglichkeit, freigegebene Elemente in untergeordneten Publikationen zu indizieren.

3

Ich glaube nicht, dass Sie das URL-Präfix in Ihre Suchabfrage als das indizierte Element einschließen können. Da freigegebene Elemente nicht indiziert sind, indexieren Sie die Seite wahrscheinlich aus der Ebene der Website-Struktur, die nie veröffentlicht wird.

Wenn eine Strukturgruppe verschoben wird, müssen Sie einen Ereignishandler erstellen, der die erneute Indizierung aller untergeordneten Seiten mithilfe einer geschützten Methode der TOM.NET-API auslöst. Diese Methode ist nicht Teil der öffentlichen API, daher würde die Veröffentlichung des Codes für diese Lösung mich wahrscheinlich zu einer persona non grata mit

erklären Bevor Sie alles neu indizieren, sollten Sie die ursprüngliche Veröffentlichungslokalisierungs-URL speichern die Strukturgruppe in der Eigenschaft TcmEventArgs.ContextVariables, damit Sie überprüfen können, ob eine Neuindizierung erforderlich ist.

+0

Guter Punkt über das Auslösen des Re-Index nur, wenn sich eine SG-Veröffentlichungs-URL geändert hat - dies könnte eine starke Neuindizierung für große Sites vermeiden. Da SGs nicht versioniert sind, ist der einzige Weg, dies zu tun, das Ereignissystem, wie Sie es gesagt haben. – Will

+0

Ja, deine Bearbeitung war korrekt. Ich habe Strukturgruppe statt Seite gemeint. –