Magnolia CMS und Apache Solr Facettensuche – Teil 2 (Technische Perspektive)

Ausgangslage

Wie in Teil 1 bereits beschrieben, ist es manchmal erforderlich, dass eine gewisse Menge an Informationsitems angezeigt werden muss. Um dem Benutzer hier die Möglichkeit zu geben, die für ihn relevanten Informationen zu filtern sollen mehrere unterschiedliche Filter aus verschiedenen Kategorien gewählt werden können. Die Filter sollen sich beliebig kombinieren lassen, so dass am Ende nur die für den Benutzer wirklich relevanten Informationen angezeigt werden. (In diesem Fall zu sehen bei: www.famigros.ch)

Den Teasern können beliebige Fakten aus beliebigen Kategorien zugewiesen werden. Ein Beispiel wäre „location/Ostschweiz“.

Grundidee

Für die Lösung des Problems wird die Facettensuche des Apache Solr Servers verwendet. Um den Solr Server mit Daten zu versorgen benutzen wir Magnolias Aktivierungs Workflow und pushen beim Aktivieren die entsprechenden Daten. Die Abfrage der Ergebnissmenge erfolgt aus dem Frontend. Der Ablauf für das Bereitstellen der Solr-Dokumente ist also dieser:

  1. Es wird ein neues Informationsitem (z.B. Teaser) in Magnolia erfasst.
  2. Der Benutzer kann diesem aus einem Katalog Ausprägungen verschiedener Kategorien zuweisen
  3. Der Benutzer aktiviert den Content
  4. Während der Aktivierung wird das Informationsitem an den SOLR gepusht

Im Frontend ist der Ablauf dieser:

  1. Besucher gehen auf die Seite mit den Items
  2. Besucher wählen einen Filter
  3. Es gibt einen Request auf den Solr, der die gefilterten Ergebnisse in Form eines JSON zurückgibt
  4. Das Frontend stellt die gefilterten Items dar

Umsetzung Datenbereitstellung

Für die Umsetzung verwenden wir  SolrJ innerhalb eines eigenen Index Services in Magnolias Application Context. Der Aktivieren-Workflow wird so angepasst, dass ein neues Command aufgenommen wird (command-default-pushToSolr).

adminCentral-workflowConfig

Dieses Command muss entsprechend (http://documentation.magnolia-cms.com/display/DOCS45/Commands) in der Konfiguration / modules / adminInterface / command / default definiert werden.

adminCentral-commandConfig

Die Command Class selbst erweitert „BaseActivationCommand“.

Ein Stolperstein ist, dass das Command nicht innerhalb des ApplicationContexts läuft, sondern bei jedem Aktivieren neu erzeugt wird. Deshalb muss man den Service per getBean vom Context abholen (Beispielimplementierung für ApplicationContextAware: hier). Der Solr Service selbst erstellt ein org.apache.solr.common.SolrInputDocument und sendet es an den Solr Server.

HttpSolrServer server = new HttpSolrServer(solrServerUrl);
server.add(docs);
server.commit();

Die Implementierung des Deaktivieren Workflows erfolgt dann entsprechend.

Fazit

Die Integration von Solr und Magnolia funktioniert auf die oben beschriebene Weise überraschend einfach und die Abfrage aus dem Frontend ist rasend schnell.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>