GSB 7.0 Standardlösung

Expertensuche

Bitte beachten: Diese Informationen beziehen sich auf den GSB 7 und werden aktuell überarbeitet!

Im Folgenden finden Sie Informationen zur Konfiguration der Expertensuche der Standardlösung.

Die bei der erläuterten Konfigurationen werden hier nur noch mal kurz erläutert, 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 und der Template-Sprache Velocity nötig sind.

Aufbau des Formulars

Für Details, wie man ein Formular aufbaut, sei auf die Dokumentation von Formularen und die Servicesuche hingewiesen.

In der Expertensuche sieht das Formular folgendermassen aus:

Expertensuche Formular Expertensuche Formular

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.

Expertensuche Action Expertensuche Action

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

Mapping Andere Felder Mapping Andere Felder

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

Mapping Auswahlfelder_cl2 Mapping Auswahlfelder_cl2

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

Mapping Datumsfelder Mapping Datumsfelder

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)
  • 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.

Suchkonfiguration Highlighting Suchkonfiguration Highlighting

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.

#if( $form and $collatedResult )  $form.InitAddFormParams  #set( $link = $cms.link($form, "", ["addParam_templateQueryString", $collatedResult]) )  <p>$cms.message("Suche_MeintenSie") <a href="$link">$cms.escapeXml($collatedResult)</a></p>  $form.ResetAddFormParams#end
#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      <p>$cms.message("KeineTreffer")</p>      ## 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

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.
#if( $topic || $docType )  <div class="boxWrapper contextBox">    <div class="box">      <h3><span>$cms.message("SuchergebnisseFiltern")</span></h3>      $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[...]    </div>  </div>  $form.ResetAddFormParams#end
  • 2. Themen-Filter
    • Falls kein Thema ausgewählt ist, gib alle verfügbaren Themen der Suche aus
    • Falls 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)
## filter by themes             #if( $topic && $topic.Values && $topic.Values.size() > 0 )    <h4><span>$cms.message("Thema")</span></h4>    <ul>                            #foreach( $facetValue in $topic.Values )                                #if( $facetValue.Name and $facetValue.Name.length() > 0 )                                    #set( $facetTitle = $facetValue.Name )                                    #if( ! $topicRequestValue.contains($facetTitle) )                                        #set( $link = $CMUtil.getFacetLinkForParameter($form,${topic.Name},$facetValue.Name,"documentType_") )      <li><a href="$link">$cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</a></li>                                    #elseif( $topicRequestValue.indexOf($facetTitle) > 0 )      <li class="selectedFacet">$cms.message("Suche_Facette_Active") $cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</li>                                    #else      <li class="selectedFacet">$cms.message("Suche_Facette_Thema_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</li>                                    #end                                #end                            #end ## ende foreach                            #if( $topicRequestValue != "" )      <li><a href="$CMUtil.getFacetAllLinkForParameter($form, "cl2Categories_Themen", "documentType_")">$cms.message("Suche_Facette_All")</a></li>                            #end    </ul>                        #end[...]
  • 3. Dokumenttyp-Facette
    • Falls kein Dokumenttyp ausgewählt ist, gib alle verfügbaren Dokumenttypen der Suche aus
    • Falls 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)
[...]## filter by doctype                         #if( $docType && $docType.Values && $docType.Values.size() > 0 )    <h4><span>$cms.message("Dokumenttyp")</span></h4>    <ul>                            #foreach( $facetValue in $docType.Values )                                #if( $facetValue.Name and $facetValue.Name.length() > 0 )                                    #set( $facetTitle = $facetValue.Name )                                    #if( !$docTypeRequestValue.contains($facetTitle) )                                        #set( $link = $CMUtil.getFacetLinkForParameter($form,${docType.Name},$facetTitle, "cl2Categories_Themen") )      <li><a href="$link">$cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</a></li>                                    #elseif( $docTypeRequestValue.contains($facetTitle) )      <li class="selectedFacet">$cms.message("Suche_Facette_Gesetzt") $cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</li>                                    #else      <li class="selectedFacet">$cms.message("Suche_DocType_${facetTitle}") ($cms.message("Suche_Facette_Anzahl") $facetValue.Count)</li>                                    #end                                #end                            #end ## ende foreach                            #if( $docTypeRequestValue != "" )      <li><a href="$CMUtil.getFacetAllLinkForParameter($form, "documentType_", "cl2Categories_Themen")">$cms.message("Suche_Facette_All")</a></li>                            #end    </ul>                        #end[...]

Suchwort Highlighting

In der Darstellung der Ergebnisse ist das Highlighting innerhalb des Velocity-Templates /standarlsg/SiteGlobals/Layout/ContentRegion/Tabellen/Layout_SearchResult angegeben.

<ol id="searchResult" class="links">  #set($firstIndex = $slot.firstEntryIndex)  #foreach( $entry in $slot.entries )    #set($currentIndex = $firstIndex + $velocityCount)    <li>${currentIndex}.      - <em title="Relevanz: ${entry.Wrapper.PercentalScore}%" class="relevance        relevance${entry.Wrapper.PercentalScore}">Relevanz: ${entry.Wrapper.PercentalScore}%</em>      $cms.include($entry.Wrapper.LanguageEnt, "renderSearchResultHighlighted",["wrapper", $entry.Wrapper])    </li>  #end</ol>

Das eigentliche Rendering übernimmt dabei das JSP-Template "renderSearchResultHighlighted". Dieses Template gibt drei Dinge aus:

  1. Den Titel des gefundenen Dokuments als Link auf das Dokument
  2. Den Kontext des Suchbegriffs im Dokument samt gehighlightetem Suchbegriff
  3. 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.