Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Liferay – Web Content und OpenSearch

Will man eigene Inhalte in die Liferay Suche integrieren, kann man hier am Beispiel eines Bookmark Portlets die notwendigen Schritte für die Umsetzung nachvollziehen. Zusammenfassend lässt sich sagen, dass man folgende Schritte umsetzen muss:

  1. Implementierung einer com.liferay.portal.kernel.search.Indexer Klasse.
  2. Implementierung einer com.liferay.portal.kernel.search.OpeanSearch Klasse.
    (Die Suche in Liferay basiert auf einzelnen OpenSearch Providern)
  3. Hinzufügen der <indexer-class> und <open-search-class> in die liferay-portlet.xml.

Will man jedoch die Suchergebnisliste der Standard Liferay Suche dahingehend erweitern, dass bestimmte Web Contents in einem separaten Bereich mit spezieller Verlinkung erscheinen, kann man verschiedene Schritte aus dem Beispiel einsparen, muss aber auf einige Stolpersteine achten:

Als Szenario könnte man sich die Suche nach Web Contents mit einem/einer speziellen Template/Structure (z.B. Supportmeldungen) vorstellen, die in der Suchergebnisliste gesammelt erscheinen und auf ein externes System gelinkt werden sollen.

Da man es hier mit vorhandenen Liferay-Inhalten (JournalArticles) zu tun hat, hat man das Glück, dass die Erstellung und Aktualisierung der Web Content Dokumente im Suchindexes bereits vom Liferay-eigenen JournalIndexer vorgenommen wird. Darum braucht man sich also nicht zu kümmern. Leider kann man nicht ganz darauf verzichten, eine eigene Indexer Klasse zu erstellen, da sonst in der eigenen HitsOpenSearch-Implementierung eine NullpointerException fliegt. Wichtig ist im Indexer außerdem, dass die Methode getClassNames() etwas anderes, als der JournalIndexer zurückliefert, da die IndexerRegistry in Liferay die ClassNames als Key verwendet. Nimmt man den selben ClassName, wie der JournalIndexer, dann wird der ursprüngliche Indexer für Web Content deaktiviert!

Außerdem ist die Portlet-Id, welche der Indexer zurückliefert von großer Bedeutung. Das Pattern für die Portlet-Id lautet <portlet-name in portlet.xml>_WAR_<webapp name>. Ein Beispiel könnte folgende ID sein: „support-portlet-max_WAR_webcontent-list-portlets“.

Weiterhin sind in dem Indexer die Methoden search() und getSummary() zu implementieren. Die übrigen Methoden muss man ohne eigene Logik belassen, da der JournalIndexer die Funktionalität bereits übernimmt. In der Methode search() wird die Suchlogik integriert und in getSummery() wird das Suchergebnis vorbereitet. Die OpenSearch Implementation erfordert unter anderem die Implementierung der Methode getHits(), welche die selbe Suchlogik, wie die Methode search in der Indexer Klasse beinhalten sollte.

Die implementierten Klassen werden folgendermaßen in die liferay-portlet.xml eingebunden:

<portlet>
<portlet-name>support-portlet-max</portlet-name>
<icon>/icon.png</icon>
<indexer-class>de.communardo.liferay.SupportIndexer</indexer-class>
<open-search-class>de.communardo.liferay.SupportOpenSearch</open-search-class>
<instanceable>true</instanceable>
<header-portlet-css>/css/portlet.css</header-portlet-css>
<footer-portlet-javascript>/js/javascript.js</footer-portlet-javascript>
<css-class-wrapper>
support-portlet-max</css-class-wrapper>
</portlet>

Nach dem Deployen darf man dann das Ergebnis in der Suchergebnisliste bewundern:

Kommentar hinterlassen


Pin It on Pinterest