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

Erweiterung der Lucene-Suche in Confluence 2.10

Im Abschnitt Anpassung von Core-Klassen des Atlassian Confluence Frameworks wurde bereits aufgezeigt, in wieweit Confluence 2.10 Klassen im nachhinein angepasst werden können. Dieser Abschnitt soll sich nun aufbauend darauf mit der Lucene-Suche beschäftigen.

Anmerkung:

Die nachfolgenden Erweiterungen/Anpassungen werden nicht – sofern nicht explizit darauf hingewiesen wurde – in den Plugin-Projekten vorgenommen. Es ist unbedingt erforderlich, dass ein Projekt erstellt werden muss, welches kompiliert als jar direkt im WEB-INF/lib Ordner abgelegt wird, so dass Confluence die Klassen beim Start unmittelbar zur Verfügung stehen.

Vorgehen:

1. Die Sprache muss in den Lucene-Index gespeichert werden.

Damit Lucene beim Indizieren auch das zusätzliche Attribut aufnehmen kann, muss eine neue Klasse angelegt werden, die von der Klasse Extractor erbt. Die Methode addFields() muss dabei so umgeschrieben werden, dass das neue Attribut ausgelesen und als Feld unter einem festgelegten Attributschlüssel indiziert werden kann. Damit Confluence diesen Extractor auch ausführt, muss die Datei core-extractors.xml* angepasst werden. Dafür ist es erforderlich die folgenden Zeilen einzufügen.

<extractor name="..." key="..." priority="...">
 <description>...</description>
</extractor>

2. Nach der Sprache muss gesucht werden können.

Damit nach einem festgelegten Attributschlüssel gesucht werden, muss die SearchQuery Klasse erweitert werden. Die getKey() Methode, die den festgelegten Attributschlüssel für die Suche zurückgibt und die getParameters() Methode, die die Suchemenge zurückliefert, müssen dabei überschrieben werden.

Des Weiteren ist eine Klasse notwendig, die vom LuceneQueryMapper erbt. Die convertToLuceneQuery() Methode ist dabei die einzige Methode, die überschrieben werden muss. Sie enthält die Suchlogik für ein bestimmtes Kriterium. Welche Möglichkeiten Lucene an dieser Stelle bietet, lesen Sie bitte in der einschlägigen Literatur oder im Internet unter Lucence nach. Damit Confluence diesen Mapper verwendet, muss die lucene-search-mappers.xml* mit dem folgenden Eintrag ergänzt werden.

<lucene-query-mapper name="..." key="..." class="..." handles="...">
 <description>...</description>
</lucene-query-mapper>

Die Confluence Action-Klassen, wie die SearchSiteAction, verwenden die SearchQueryParameters Klasse, um die Suchkriterien zu transportieren. Es empfiehlt sich diese Klasse um das zusätzliche Attribut zu ergänzen. Im Falle der Sprachattributerweiterung wären das eine Instanzvariabel und die zugehörigen Setter und Getter.

Auf die Anpassung innerhalb der Plugin Actions wird hier allerdings nicht näher eingegangen werden, da sie recht manigfaltig ausfallen kann, trotzdem nicht allzu kompliziert sind.

Die SearchQueryParameters werden der Methode siteExtendedSearch der Klasse DefaultPredefinedSearchBuilder übergeben. Damit diese Methode weiterhin verwendet werden kann, muss die DefaultPredefinedSearchBuilder Klasse entsprechend erweitert werden.  Im Body dieser Methode werden die einzelnen SearchQuerys einem Set hinzugefügt. Notwendig wäre zum Beispiel für das Sprachattribut der folgende Eintrag.

if ((searchQueryParams.getLanguages() != null) && !searchQueryParams.getLanguages().isEmpty()) {
  scopedQuery.add(new LanguagesQuery(searchQueryParams.getLanguages()));
}

Nach diesen Änderung hat man bereits den Titel dieses Beitrags überstanden.

* Wie die core-extractors.xml und lucene-search-mappers.xml entsprechend verändert werden müssen, damit Confluence diese auch berücksichtigt, entnehmen Sie bitte von diesem Beitrag Anpassung von Core-Klassen des Atlassian Confluence Frameworks. Zu beachten wäre, dass dafür auch die pluginServiceContext.xml verändert werden muss.

1 Kommentar

Hallo Andreas,
im Folgenden eine Alternative zu deiner Lösung ohne Core-Klassen anpassen zu müssen:
zu 1.
Es gibt zur Erweiterung der Suche einen speziellen Plugin Modultyp für Extraktoren: http://confluence.atlassian.com/display/DOC/Extractor+Plugins . Damit kann diese Erweiterung auch über ein Plugin erfolgen.
zu 2.
Hier wird es schon etwas schwieriger. Man muss die Confluence-Standardsuche austauschen. Dazu müsste man die SearchSiteAction überschreiben und dort die übergebe (ungeparste) Query mittels Lucene-Syntax um die Suche nach dem neuen Field (z. B. Sprache) erweitern.
Das Austauschen der SearchSiteAction kann wie im Artikel https://www.communardo.de/techblog/2008/10/15/erweitern-von-actions-in-confluence/ oder über die Conveyor Library von Customware erfolgen: http://www.customware.net/repository/display/AtlassianPlugins/Confluence+Conveyor+Library
Habe beides bereits erfolgreich angewendet. Einziger Nachteil: wenn die selbe Action mehrfach überschrieben wird (z.B. in einem weiteren Plugin), kann nur eines von beiden Plugins „gewinnen“. Dabei ist nicht klar welches (bei der letzten Variante erscheint aber zumindest eine Meldung im Log auf Level ERROR).

Kommentar hinterlassen


Pin It on Pinterest