Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Erweiterung der Lucene-Suche in Confluence 2.10

Im Abschnitt Anpassung von Core-Klassen des Atlassian Confluence Frameworks wurde bereits auf­ge­zeigt, in wie­weit Confluence 2.10 Klassen im nach­hin­ein ange­passt wer­den kön­nen. Dieser Abschnitt soll sich nun auf­bau­end dar­auf mit der Lucene-Suche beschäftigen.

Anmerkung:

Die nach­fol­gen­den Erweiterungen/Anpassungen wer­den nicht – sofern nicht expli­zit dar­auf hin­ge­wie­sen wurde – in den Plugin-Projekten vor­ge­nom­men. Es ist unbe­dingt erfor­der­lich, dass ein Projekt erstellt wer­den muss, wel­ches kom­pi­liert als jar direkt im WEB-INF/lib Ordner abge­legt wird, so dass Confluence die Klassen beim Start unmit­tel­bar zur Verfügung stehen.

Vorgehen:

1. Die Sprache muss in den Lucene-Index gespei­chert werden.

Damit Lucene beim Indizieren auch das zusätz­li­che Attribut auf­neh­men kann, muss eine neue Klasse ange­legt wer­den, die von der Klasse Extractor erbt. Die Methode addFields() muss dabei so umge­schrie­ben wer­den, dass das neue Attribut aus­ge­le­sen und als Feld unter einem fest­ge­leg­ten Attributschlüssel indi­ziert wer­den kann. Damit Confluence die­sen Extractor auch aus­führt, muss die Datei core-extractors.xml* ange­passt wer­den. Dafür ist es erfor­der­lich die fol­gen­den Zeilen einzufügen.

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

2. Nach der Sprache muss gesucht wer­den können.

Damit nach einem fest­ge­leg­ten Attributschlüssel gesucht wer­den, muss die SearchQuery Klasse erwei­tert wer­den. Die getKey() Methode, die den fest­ge­leg­ten Attributschlüssel für die Suche zurück­gibt und die getParameters() Methode, die die Suchemenge zurück­lie­fert, müs­sen dabei über­schrie­ben werden.

Des Weiteren ist eine Klasse not­wen­dig, die vom LuceneQueryMapper erbt. Die convertToLuceneQuery() Methode ist dabei die ein­zige Methode, die über­schrie­ben wer­den muss. Sie ent­hält die Suchlogik für ein bestimm­tes Kriterium. Welche Möglichkeiten Lucene an die­ser Stelle bie­tet, lesen Sie bitte in der ein­schlä­gi­gen Literatur oder im Internet unter Lucence nach. Damit Confluence die­sen Mapper ver­wen­det, muss die lucene-search-mappers.xml* mit dem fol­gen­den Eintrag ergänzt werden.

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

Die Confluence Action-Klassen, wie die SearchSiteAction, ver­wen­den die SearchQueryParameters Klasse, um die Suchkriterien zu trans­por­tie­ren. Es emp­fiehlt sich diese Klasse um das zusätz­li­che Attribut zu ergän­zen. Im Falle der Sprachattributerweiterung wären das eine Instanzvariabel und die zuge­hö­ri­gen Setter und Getter.

Auf die Anpassung inner­halb der Plugin Actions wird hier aller­dings nicht näher ein­ge­gan­gen wer­den, da sie recht manigfal­tig aus­fal­len kann, trotz­dem nicht allzu kom­pli­ziert sind.

Die SearchQueryParameters wer­den der Methode siteExtendedSearch der Klasse DefaultPredefinedSearchBuilder über­ge­ben. Damit diese Methode wei­ter­hin ver­wen­det wer­den kann, muss die DefaultPredefinedSearchBuilder Klasse ent­spre­chend erwei­tert wer­den.  Im Body die­ser Methode wer­den die ein­zel­nen SearchQuerys einem Set hin­zu­ge­fügt. Notwendig wäre zum Beispiel für das Sprachattribut der fol­gende Eintrag.

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

Nach die­sen Änderung hat man bereits den Titel die­ses Beitrags überstanden.

* Wie die core-extractors.xml und lucene-search-mappers.xml ent­spre­chend ver­än­dert wer­den müs­sen, damit Confluence diese auch berück­sich­tigt, ent­neh­men Sie bitte von die­sem Beitrag Anpassung von Core-Klassen des Atlassian Confluence Frameworks. Zu beach­ten wäre, dass dafür auch die pluginServiceContext.xml ver­än­dert wer­den muss.

Related Posts

1 Kommentar

Hallo Andreas,
im Folgenden eine Alternative zu dei­ner Lösung ohne Core-Klassen anpas­sen zu müssen:
zu 1.
Es gibt zur Erweiterung der Suche einen spe­zi­el­len 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 schwie­ri­ger. Man muss die Confluence-Standardsuche aus­tau­schen. Dazu müsste man die SearchSiteAction über­schrei­ben und dort die über­gebe (unge­parste) Query mit­tels 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 erfol­gen: http://www.customware.net/repository/display/AtlassianPlugins/Confluence+Conveyor+Library
Habe bei­des bereits erfolg­reich ange­wen­det. Einziger Nachteil: wenn die selbe Action mehr­fach über­schrie­ben wird (z.B. in einem wei­te­ren Plugin), kann nur eines von bei­den Plugins "gewin­nen". Dabei ist nicht klar wel­ches (bei der letz­ten Variante erscheint aber zumin­dest eine Meldung im Log auf Level ERROR).

Comments are closed.

Pin It on Pinterest