Version: GSB 7Expertensuche
In diesem Artikel wird die Konfiguration der Expertensuche der Standardlösung erläutert. Die bei der GSB7/Servicesuche erläuterten Konfigurationen werden hier nur noch mal kurz angerissen, die Punkte Highlighting, Facettierung und Meinten Sie ausführlich behandelt. Zum Verständnis der kompletten Konfiguration sei noch mal erwähnt, dass Kenntnisse der Solr-Query-Syntax / Lucene-Query-Syntax und der Template-Sprache Velocity nötig sind.
Aufbau des Formulars
Für Details, wie man ein Formular aufbaut, sei auf die Dokumentation des Formularbaukastens und die Servicesuche hingewiesen.
In der Expertensuche sieht das Formular folgendermaßen aus:
Im Gegensatz zur Servicesuche sind ein paar Formularfelder hinzugekommen und der Sortierparameter ist rausgenommen. Der Rest der Verarbeitungskette ist genau gleich.
Konfiguration der Felder
Aus der Konfiguration der Felder ist folgendes wichtig:
- textfield -> ID (idName) : templateQueryString, Standartwert (defaultValue) : Suchbegriff
- dateAfter -> ID (idName) : lastChangeAfter, Standartwert (defaultValue) : tt.mm.jjjj
- dateBefore -> ID (idName) : lastChangeBefore, Standartwert (defaultValue) : tt.mm.jjjj
Zusätzlich existiert noch ein Slot für Fehlerausgaben des Formulars, falls eine der konfigurierten Validierungen der Felder fehlschlägt oder es Fehler bei der Auswertung der Suchanfrage gibt.
Konfiguration der Such-Action
Die Such-Action der Expertensuche wurde schon kurz im Rahmen der Servicesuche angesprochen. An dieser Stelle wird auf die noch nicht erläuterten Details eingegangen.
Neben der schon beschriebenen Suche werden in der Expertensuche noch drei weitere Möglichkeiten von Solr benutzt und zwar sogenannte Filter-Queries Zur einschränkung des Suchraums, Facetten, die mehr Informationen über bestimmte Felder des Suchergebnisses liefern und Suchwort-Highlighting für die Darstellung der Treffer.
Filter-Queries
Die Syntax der Filterqueries ist die gleiche, die auch beim Aufbau des Query-Parameters benutzt wird, nur der Aufbau mehrerer Filter gestaltet sich ein wenig anders. Der Vorteil von Filter-Queries liegt im Caching von Solr. Durch das Zwischenspeichern der Ergebnisse einzelner Filterqueries muss bei einer Suchanfrage nur noch die Schnittmenge von den verschiedenen Filterergebnissen gebildet werden und in dieser dann gesucht werden, was die Suche beschleunigt.
- solr.fq.list - Eine kommaseparierte Liste mit technischen Namen der einzelnen Filter
- solr.fq.list.<Name> - Eine Filter-Query für einen in der vorigen Liste übergebenen Namen
Die Einschränkung des Suchraums ist am einfachsten an dem Filter language
zu erklären. Dieser statische Filter macht nichts anderes, als den Suchraum über das Indexfeld language_
auf deutschsprachige Dokumente (de
) einzuschränken. Die Filter-Queries und das Mapping im einzelnen sind: solr.fq.list.documentTypeFilter=$!solr_docType
Der Suchraum wird standardmäßig auf die Dokumenttypen Basepage Speech Interview Employee JobOffer Publication News
eingeschränkt. Dies geschieht über die Angabe des Filters solr.fq.list.documentTypeDefaultFilter=$!solr_docTypeDefault in den Action-Properties.
Wenn es eine dedizierte Einschränkung über Requestparametergibt, werden die übergebenen Dokumenttypen als zusätzliche Einschränkung benutzt. Zu beachten ist hier, dass dieser Filter mit einem tag (tag=fqdoctype}) definiert wurde, sodass dieser Filter bei der Definition der Facette in der Action für den Dokumenttyp exkludiert werden kann: solr.facet.list.docType={!ex=fqdoctype}documentType_. Damit ist eine ODER Suche auf Basis der Facettenlinks möglich, sodass auch nach mehreren Dokumenttypen gleichzeitig gesucht werden kann. Würde dieser Mechanismus nicht genutzt werden, würde ein Klick auf die Facette dazu führen, dass nur noch der gewählte Dokumenttyp stehen bleiben würde und alle anderen Dokumenttypen nicht mehr auswählbar wären (Dokumenttypen sind auf Dokumentebene per Definition disjunkt).
solr.fq.list.themenFilter=$!solr_cl2Categories_Themen
Falls im Request der Parameter cl2Categories_Themen
übergeben wird, wird der Suchraum auf das übergebene Thema bzw. die übergebenen Themen eingeschränkt.
solr.fq.list.lastChangeBeforeFilter=$!solr_lastChangeBeforesolr.fq.list.lastChangeAfterFilter=$!solr_lastChangeAfter
Falls im Request einer der Parameter lastChangeAfter
und lastChangeBefore
nicht leer ist und nicht dem Standardwert entspricht, wird die Suche auf ein Zeitintervall eingeschränkt. Hierbei sind für die Suche mehrere Dinge zu beachten:
- Das Intervall wird immer vom älteren Datum zum jüngeren Datum definiert.
- Der * symbolisiert ein offenes Ende des Intervalls.
- Die Syntax ist
[datum_alt TO datum_jung]
- Die Intervallgrenzen gehören zum Suchergebnis
- Das Datum muss ins Solr-Datumsformat umgewandelt werden.
- Das Format für den 6. Juni 1976, 23:59:59 Uhr und 999 ms entspricht z.B.
1976-03-06T23:59:59.999Z
im Solr-Format. - Im GSB gibt als Hilfe die Methode $CMUtil.getSolrDate(_datum_,_format_des_datums) um Daten aus einem angegebenen Format ins Solr-Date umzuwandeln
- Solr akzeptiert noch die sogennante DateMath-Syntax um relative Daten anzugeben, z.B. der aktuelle Zeitpunkt (NOW) oder der heutige Tag (NOW/DAY oder auch kurz /DAY)
- Das Format für den 6. Juni 1976, 23:59:59 Uhr und 999 ms entspricht z.B.
- Da die Suche nach bestimmten Datumsintervallen selten mit gleichen Daten erfolgt, ist es besser, das Caching für Datumsfilter auszuschalten. Dies geschieht beim Mapping durch den lokalen Solr-Parameter
{!cache=false}
.
Facettierung
Eine Facette liefert zu einem Suchergebnis die Anzahl von verschiedenen Eigenschaften oder Kategorien in die sich das Suchergebnis unterteilen läßt. Diese Information wird normalerweise Hand in Hand mit Filter-Queries benutzt, um ein Suchergebnis weiter einzuschränken. Die Parameter für die facettierte Suche im einzelnen:
- solr.facet - legt fest, ob facettiert Gesucht werden soll
- solr.facet.mincount - legt fest, wie viele Dokumente eine bestimmte Eigenschaft/Kategorie mindestens haben müssen, um im Ergebnis aufzutauchen
- solr.facet.limit - legt fest, wie viele Eigenschaften/Kategorien bei einer Facette maximal angezeigt werden
- solr.facet.sort - die Sortierreihenfolge der Facetten, lexikographisch (index) oder nach Anzahl (count)
- solr.facet.list - die Liste der Facettennamen
- solr.facet.list.<Facettenname> - die Definition einer Facette, im einfachsten Beispiel der Name eines Feldes aus dem Index
Da Facetten ausserhalb des Formulars gerendert werden, muss man entweder die Übergabeparameter als HiddenFields
mit in das Formular integrieren oder über den Parameter additionalFormParameters
in der Action verfügbar machen. Die bei der Expertensuche benutzten Filter-Queries sind der themenFilter
und der documentTypeFilter
.
Suchwort-Highlighting
Die Konfiguration für das Highlighting des Suchergebnisses erfolgt im Konfigurationsdokument SuchwortHighlighting
.
Die Parameter im Einzelnen:
- solr.hl - soll das Highlighting berechnet werden
- solr.hl.fl - das Feld des Indexes, das für das Highlighting benutzt wird
- solr.hl.useFastVectorHighlighter - gibt an, welcher Algorithmus für das Highlighting benutzt wird
- solr.hl.fragsize - die maximale länge des Textausschnitts in Zeichen für das Highlighting
- solr.hl.simple.pre - das Anfangs-HTML-Tag für das Highlighting
- solr.hl.simple.post - das zugehörige End-HTML-Tag für das Highlighting
Zusätzliche Informationen zum Highlighting finden sich in der offiziellen Solr-Dokumentation.
Ergebnis-Darstellung
Für die Ergebnisdarstellung sind die Layout Dokumente im Zusammenspiel mit GenericJSPs verantwortlich. Zur Übersicht noch mal die komplette Hierarchie der Ergebnisdarstellung in der Expertensuche.
/ success/failure target : /standarlsg/DE/Service/Suche/suche_node|-- target : /standarlsg/DE/Service/Suche/suche_target| |-- content : /standarlsg/SiteGlobals/Forms/Expertensuche_Integrator| | |-- formular : /standarlsg/SiteGlobals/Forms/Expertensuche_Formular| | | `-- searchResultTable : /standarlsg/SiteGlobals/Functions/Solr/Suche/Ergebnisdarstellung/Expertensuche/Solr_Ergebnis| | | |-- list : /standarlsg/SiteGlobals/Functions/Solr/Suche/Ergebnisdarstellung/Expertensuche/Solr_Ergebnis_Set| | | |-- meintenSie : /standarlsg/SiteGlobals/Functions/Solr/Suche/Ergebnisdarstellung/MeintenSie_TemplateQueryString| | | `-- layout : /standarlsg/SiteGlobals/Layout/ContentRegion/Tabellen/Layout_SearchResult| | `-- layout : /standarlsg/SiteGlobals/Layout/Formulare/Layout_Expertensuche| `-- supplement : /standarlsg/SiteGlobals/Functions/Solr/Suche/Ergebnisdarstellung/Expertensuche/Facettierung| `-- layout : /standarlsg/SiteGlobals/Layout/Views/GenericJSP/Facets
Meinten Sie
Die Ausgabe von alternative Suchbegriffen ist den Dokumenten /standarlsg/SiteGlobals/Functions/Solr/Suche/Ergebnisdarstellung/MeintenSie_TemplateQueryString
und /standarlsg/SiteGlobals/Layout/ContentRegion/Tabellen/Layout_SearchResult
konfiguriert. Das erste Dokument legt dabei fest, was für die Ausgabe erzeugt wird, das zweite, wann es erzeugt wird.
<syntaxhighlight lang="xml" enclose="div">
- if( $form and $collatedResult )
$form.InitAddFormParams #set( $link = $cms.link($form, "", ["addParam_templateQueryString", $collatedResult]) )
$cms.message("Suche_MeintenSie") <a href="$link">$cms.escapeXml($collatedResult)</a>
$form.ResetAddFormParams
- end
</syntaxhighlight>
<syntaxhighlight lang="xml" enclose="div">
- foreach( $slot in $slots )
## display page results #set( $iNumTotalEntries = $slot.NumTotalEntries ) #set( $iNumEntriesPerPage = $slot.EntriesPerPage ) ## Standardmäßig wird "meintenSie" nicht ausgegeben #if($slot.Name != "meintenSie") #if( $iNumTotalEntries > 0 ) [... Ausgabe der Treffer ...] #else
$cms.message("KeineTreffer")
## Falls keine Treffer gefunden wurden und es einen Alternativvorschlag für die Suche gibt, dann gib ihn aus #if($slots.get("meintenSie") && $slots.get("meintenSie").Entries && $slots.get("meintenSie").Entries.size() > 0) $slots.get("meintenSie").Entries.get(0) #end #end #end
- end
</syntaxhighlight>
Facetten
Die Ansicht für die Facetten wird im Target als supplement
eingehängt. Die Darstellung wird über die GenericJSPEnt
/standarlsg/SiteGlobals/Layout/Views/GenericJSP/Facets
eingebunden. In diesem Dokument werden in den Konfigurationsparametern (localConfiguration
) die einzubindenden Facetten festgelegt. Folgende Konfiguration ist dabei in der Standardlösung hinterlegt:
- facets=docType,topic - Die Liste der anzuzeigenden Facetten
- docType=documentType_ - Die Definition der Dokumenttypen-Facette
- theme=cl2Categories_Themen - Die Definition der Themen-Facette
Die Facetten werden also analog zur Konfiguration in der Formularaction eingebunden. Das Template zur Ausgabe besteht im groben aus drei Teilen:
1. Initialisierung - Es wird überprüft, ob die Facetten verfügbar sind und falls ja werden die Formular und die Facettenparameter für die Linkgenerierung der Facetten gesetzt.
<syntaxhighlight lang="xml" enclose="div">
- if( $topic || $docType )
$cms.message("SuchergebnisseFiltern")
$form.InitAddFormParams #set( $topicRequestValue = $CMUtil.getRequest().getParameter($theme.Name) ) #if( ! $topicRequestValue ) #set( $topicRequestValue = "" ) #end
#set( $docTypeRequestValue = $CMUtil.getRequest().getParameter($docType.Name) ) #if( ! $docTypeRequestValue ) #set( $docTypeRequestValue = "" ) #end
[...]
$form.ResetAddFormParams
- end
</syntaxhighlight>
2. Themen-FilterFalls kein Thema ausgewählt ist, gib alle verfügbaren Theman der Suche ausFalls ein Thema schon ausgewählt wurde, gib dieses als ausgewählt aus und stelle einen Link zum zurücksetzen der Facette bereit (hier mit neuen CMUtil Methoden)
<syntaxhighlight lang="xml" enclose="div">
- filter by themes
#if( $topic && $topic.Values && $topic.Values.size() > 0 )
$cms.message("Thema")
- <a href="$link">$cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</a>
#elseif( $topicRequestValue.indexOf($facetTitle) > 0 )
- $cms.message("Suche_Facette_Active") $cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)
#else
- $cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)
#end #end #end ## ende foreach #if( $topicRequestValue != "" )
- <a href="$CMUtil.getFacetAllLinkForParameter($form, "cl2Categories_Themen", "documentType_")">$cms.message("Suche_Facette_All")</a>
#end
#end
[...] </syntaxhighlight>
3. Dokumenttyp-FacetteFalls kein Dokumenttyp ausgewählt ist, gib alle verfügbaren Dokumenttypen der Suche ausFalls ein Dokumenttyp schon ausgewählt wurde, gib diesen als ausgewählt aus und stelle einen Link zum zurücksetzen der Facette bereit (hier mit neuen CMUtil Methoden)
<syntaxhighlight lang="xml" enclose="div"> [...]
- filter by doctype
#if( $docType && $docType.Values && $docType.Values.size() > 0 )
$cms.message("Dokumenttyp")
- <a href="$link">$cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</a>
#elseif( $docTypeRequestValue.contains($facetTitle) )
- $cms.message("Suche_Facette_Gesetzt") $cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)
#else
- $cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)
#end #end #end ## ende foreach #if( $docTypeRequestValue != "" )
- <a href="$CMUtil.getFacetAllLinkForParameter($form, "documentType_", "cl2Categories_Themen")">$cms.message("Suche_Facette_All")</a>
#end
#end
[...] </syntaxhighlight>
Suchwort Highlighting
In der Darstellung der Ergebnisse ist das Highlighting innerhalb des Velocity-Templates /standarlsg/SiteGlobals/Layout/ContentRegion/Tabellen/Layout_SearchResult
angegeben.
<syntaxhighlight lang="xml" enclose="div">
- ${currentIndex}. - Relevanz: ${entry.Wrapper.PercentalScore}% $cms.include($entry.Wrapper.LanguageEnt, "renderSearchResultHighlighted",["wrapper", $entry.Wrapper])
#end
</syntaxhighlight> Das eigentliche Rendering übernimmt dabei das JSP-Template "renderSearchResultHighlighted". Dieses Template gibt drei Dinge aus:
- Den Titel des gefundenen Dokuments als Link auf das Dokument
- Den Kontext des Suchbegriffs im Dokument samt gehighlightetem Suchbegriff
- Das Veröffentlichungsdatum des Dokuments
Zusätzlich zu diesen Ausgaben werden im Velocity-Template noch die Nummer des Treffers und die Relevanz in Prozent ausgegeben.