Visualisierung von Suchergebnissen mit Solr /browse & Velocity
In Teil 2 dieser Serie erfahren Sie, wie Sie Suchergebnisse mit Solr /browse visualisieren und bestimmen, wann (und wie) Sie VelocityResponseWriter verwenden.
Die Serie
Dies ist der zweite Teil einer dreiteiligen Serie, in der wir Ihnen zeigen, wie Sie mit ein paar einfachen Befehlen eine echte Anwendung erstellen können. Die drei Teile dieser Serie sind:
- Daten mit bin/post in Solr übertragen
- ==> (Sie sind hier) Visualisierung von Suchergebnissen: /browse und darüber hinaus
- Als nächstes: Realistische Zusammenstellung: example/files – ein konkretes nützliches domänenspezifisches Beispiel für bin/post und /browse
/browse – Eine einfache, konfigurierbare, integrierte Ergebnisansicht mit Vorlagen
Wir haben diesen Punkt bereits im vorherigen Artikel bin/post angedeutet, indem wir diese Befehle ausgeführt haben –
$ bin/solr create -c solr_docs $ bin/post -c solr_docs docs/
Und hier sind wir: http://localhost:8983
Oder Sie bleiben bei der Kommandozeile, die Sie hier finden:
$ open http://localhost:8983/solr/solr_docs/browse?q=faceting
Das Vermächtnis „collection1“, auch bekannt als techproducts
Erfahrene Solr-Entwickler kennen wahrscheinlich die ursprüngliche Inkarnation von /browse. Erinnern Sie sich an /collection1/browse mit den indexierten technischen Produkten? Mit Solr 5 wurde dieses Beispiel ein wenig aufgeräumter und kann ganz einfach mit dem Schalter -e
gestartet werden:
$ bin/solr start -e techproducts
Das Beispiel techproducts erstellt nicht nur eine Sammlung von techproducts, sondern indiziert auch eine Reihe von Beispieldokumenten, was einer Ausführung entspricht:
$ bin/solr create -c techproducts -d sample_techproducts_configs $ bin/post -c techproducts example/exampledocs/*.xml
Sie sind bereit für /browse techproducts. Dies können Sie mit „open“ von der Kommandozeile aus tun:
$ open http://localhost:8983/solr/techproducts/browse
Eine Suche nach „ipod“ führt zu folgenden Ergebnissen:
Das Beispiel von techproducts ist die am besten ausgestattete /Browse-Schnittstelle, aber sie leidet unter dem Spülbeckensyndrom. Sie enthält einige coole Funktionen, wie z.B. Vorschläge für Begriffe, die Sie eingeben (geben Sie „ap“ ein und halten Sie an, dann erscheint „apple“), geografische Suche (Produkte haben erfundene „Store“-Standorte), Ergebnisgruppierung, Facettierung, Links zu ähnlichen Produkten und „Meinten Sie?“-Vorschläge. Das sind zwar alles großartige Funktionen, die in unseren Suchoberflächen oft gewünscht werden, aber die techproducts /browse wurde so überladen, dass sie nicht nur die Beispieldaten von techproducts unterstützt, sondern auch die Beispieldaten von Büchern (ebenfalls in example/exampledocs/) und sogar Rich-Text-Dateien (beachten Sie die Facette content_type). Es ist umständlich, mit den techproducts-Vorlagen zu beginnen und sie auf Ihre eigenen Bedürfnisse zuzuschneiden. Daher wurde die Out-of-the-Box-Erfahrung für Solr 5 aufgeräumt.
Neu und… generiert
Mit Solr 5 wurde /browse so konzipiert, dass es mit der Standardkonfiguration data_driven_configs (auch bekannt als „schema-less“) ausgeliefert wird. Das Beispiel techproducts hat eine eigene Konfiguration (sample_techproducts_configs) und einen eigenen Satz von Vorlagen, die wir so belassen haben, wie Sie sie oben sehen. Damit die Vorlagen allgemein für fast alle Arten von Daten, die Sie indiziert haben, funktionieren, wurden die Standardvorlagen auf das Wesentliche reduziert und eingebaut. Das erste Beispiel oben, solr_docs, veranschaulicht die „datengesteuerte“ Erfahrung mit /browse. Es spielt keine Rolle, welche Daten Sie in eine datengesteuerte Sammlung eingeben, die /browse-Erfahrung beginnt mit dem grundlegenden Suchfeld und der Ergebnisanzeige. Lassen Sie uns die /browse-Seite mit einigen sehr einfachen Daten in einer neuen Sammlung näher betrachten:
$ bin/solr create -c example $ bin/post -c example -params "f.tags.split=true" -type text/csv -d $'id,title,tagsn1,first document,An2,second document,"A,B"n3,third document,B' $ open http://localhost:8983/solr/example/browse
Diese generische Oberfläche zeigt Suchergebnisse aus einer im Suchfeld angegebenen Abfrage an, zeigt gespeicherte Feldwerte an, enthält Paging-Steuerelemente, verfügt über Debugging-/Fehlerbehebungsfunktionen (siehe unten) und umfasst eine Reihe weiterer Funktionen, die auf den ersten Blick nicht ersichtlich sind.
Facettieren
Da die Standardvorlagen keine Annahmen über die Art der Daten oder Werte in den Feldern machen, ist die Facettierung standardmäßig nicht aktiviert, aber die Vorlagen unterstützen sie. Fügen Sie facet.field=tags
zu einer /browse-Anfrage hinzu, z.B. http://localhost:8983
Wenn Sie auf den Wert einer Facette klicken, werden die Ergebnisse wie erwartet gefiltert, indem der fq-Parameter von Solr verwendet wird. Die eingebauten, generischen /browse Vorlagen unterstützen ab Solr 5.4 nur Feldfacetten. Andere Facettierungsoptionen (Bereich, Pivot und Abfrage) werden von den Vorlagen nicht unterstützt – sie werden einfach nicht in der Benutzeroberfläche angezeigt. Wenn Sie nach dem manuellen Hinzufügen von „facet.field=tags“ herumklicken, werden Sie feststellen, dass die Links den manuell hinzugefügten Parameter nicht enthalten. Wir werden weiter unten sehen, wie Sie die Benutzeroberfläche anpassen können, einschließlich des Hinzufügens einer Feldfacette zur Benutzeroberfläche. Aber lassen Sie uns erst einmal sehen, wie /browse funktioniert.
Hinweis: Die techproducts-Vorlagen verfügen über eine fest kodierte Unterstützung für andere Facetten, die Sie bei Bedarf übernehmen können. Fahren Sie fort, um zu sehen, wie Sie die Ansicht an Ihre Bedürfnisse anpassen können.
Wie funktioniert /browse?
In der technischen Sprache von Solr ist /browse ein Handler für Suchanfragen, genau wie /select – in der Tat können Sie bei jeder /browse-Anfrage Folgendes einstellen wt=xml
um die Standardergebnisse zu sehen, die die Ansicht steuern. Der Unterschied besteht darin, dass in /browse einige zusätzliche Parameter als Standardwerte definiert sind, um die Abfrage, die Facettierung und das Schreiben von Antworten zu verbessern. Abfragen sind so konfiguriert, dass der edismax Abfrageparser verwendet wird. Die Facettierung ist aktiviert, obwohl anfangs keine Felder angegeben sind, und facet.mincount=1
zeigt keine Bereiche mit Nullzählung an. Die Verbesserungen beim Schreiben von Antworten machen die geheime Sauce zu /browse, aber ansonsten ist es nur ein verbessertes /select.
VelocityResponseWriter
Anfragen an /browse sind standardmäßige Solr-Suchanfragen mit dem Zusatz von drei Parametern:
wt=velocity
: Verwenden Sie den VelocityResponseWriter, um die HTTP-Antwort aus den internen Objekten SolrQueryRequest und SolrQueryResponse zu erzeugen.v.template=browse
: Der Name der zu rendernden Vorlagev.layout=layout
: Der Name der Vorlage, die als „Layout“ verwendet werden soll, ein Wrapper um die angegebene Hauptvorlage v.template
Solr gibt Suchergebnisse in der Regel als Daten zurück, als XML, JSON, CSV oder auch in anderen Datenformaten. Am Ende der Verarbeitung einer Suchanfrage wird das Antwortobjekt zum Rendern an einen QueryResponseWriter übergeben. In den Datenformaten wird das Antwortobjekt einfach durchlaufen und mit spitzen, eckigen und geschweiften Klammern umschlossen. Der VelocityResponseWriter ist ein wenig anders und übergibt das Antwortdatenobjekt an ein flexibles Templating-System namens Velocity.
„Schnelligkeit“? Langsam, langsam! Was ist diese uralte Technologie, von der Sie sprechen? Apache Velocity gibt es schon seit langem; es ist eine erstklassige, flexible Bibliothek für Vorlagen. Velocity macht seinem Namen alle Ehre – es ist auch schnell. Ein guter Ausgangspunkt für das Verständnis von Velocity ist ein Artikel, den ich vor vielen (Bruchteilen von) Lichtjahren geschrieben habe: „Velocity: Der schnelle Weg zum Templating“. Anstatt hier ein eigenständiges Velocity-Tutorial zu geben, werden wir es anhand eines Beispiels im Zusammenhang mit der Anpassung der /browse-Ansicht durchführen. Ausführlichere Informationen finden Sie in der Dokumentation VelocityResponseWriter im Referenzhandbuch.
Hinweis: Wenn Sie keine anderen Vorkehrungen getroffen haben, können Benutzer, die auf /browse zugreifen können, auch Sammlungen, Dokumente und alles Mögliche hinzufügen, ändern, löschen oder anderweitig beeinflussen, so dass die Möglichkeit besteht, dass Datensicherheitslecks entstehen, Denial-of-Service-Angriffe erfolgen oder Sammlungen ganz oder teilweise gelöscht werden. Hört sich schlimm an, aber /browse ist nicht neu oder anders als /select, es sieht nur hübscher aus und ist benutzerfreundlich genug, um es auch Nicht-Entwicklern zugänglich zu machen.
Anpassen der Ansicht
Es gibt mehrere Möglichkeiten, die Ansicht anzupassen. Letztendlich läuft es darauf hinaus, dass die Velocity-Vorlagen das wiedergeben, was Sie wollen. Nicht alle Änderungen erfordern jedoch das Hacken von Vorlagen. Der integrierte /browse Handler verwendet eine relativ neue Funktion von Solr, die sogenannten „param sets“, die in Solr 5.0 eingeführt wurden. Der Handler ist wie folgt definiert:
<requestHandler name="/browse" class="solr.SearchHandler" useParams="query,facets,velocity,browse">
Die Einstellung useParams gibt an, welche(r) Parametersatz(e) als Standardparameter verwendet werden soll(en), so dass sie gruppiert und über eine HTTP-API gesteuert werden können. Dies ist ein Detail der Implementierung, aber die Parameter-Sets werden in einer conf/params.json-Datei definiert und das Standard-Parameter-Set wird als solches angegeben:
{"params":{ "query":{ "defType":"edismax", "q.alt":"*:*", "rows":"10", "fl":"*,score", "":{"v":0} }, "facets":{ "facet":"on", "facet.mincount": "1", "":{"v":0} }, "velocity":{ "wt": "velocity", "v.template":"browse", "v.layout": "layout", "":{"v":0} } }}
Die verschiedenen Sets dienen dazu, die Parameter nach Funktionen zu gruppieren. Beachten Sie, dass das Parameter-Set „browse“ nicht definiert ist, sondern als Platzhalter für einen Set-Namen verwendet wird, der später ausgefüllt werden kann. So weit, so gut. Anfangs werden einfache, typische Solr-Parameter verwendet. Auch hier gilt, dass alles, was gerendert wird, letztlich ein Ergebnis der Vorlage ist, die es steuert. Im Fall der Facetten werden alle Feldfacetten in der Solr-Antwort gerendert (aus facets.vm). Mithilfe der API für Parameter können wir das Feld „tags“ zum Parametersatz „facets“ hinzufügen:
$ curl http://localhost:8983/solr/example/config/params -H 'Content-type:application/json' -d '{ "update" : { "facets": { "facet.field":"tags" } } }'
Ein weiterer Vorteil von Parameter-Sets: Sie wirken sich sofort aus, wohingegen Änderungen an Request-Handler-Definitionen ein Neuladen des Kerns oder einen Neustart von Solr erfordern. Drücken Sie einfach auf Aktualisieren in Ihrem Browser auf /browse, und die neue Tags-Facette erscheint, ohne dass sie explizit in der URL angegeben wird.
In der Datei example/films/README.txt finden Sie ein Beispiel für das Hinzufügen eines Facettenfelds und die Hervorhebung von Abfragebegriffen. Die integrierten Vorlagen sind bereits so eingestellt, dass sie Feldfacetten und Feldhervorhebungen wiedergeben, wenn sie aktiviert sind. So können Sie ganz einfach einige grundlegende domänenspezifische Anpassungen vornehmen, ohne eine Vorlage direkt anfassen zu müssen.
An dieser Stelle ist /browse gleichbedeutend mit dieser /select-Anfrage: http://localhost:8983
Stellen Sie wiederum wt=xml
oder wt=json
ein und sehen Sie sich die Standardantwort von Solr an.
Überschreiben von integrierten Vorlagen
VelocityResponseWriter verfügt über einen etwas ausgeklügelten Mechanismus zum Auffinden der zu rendernden Vorlagen. Mithilfe einer „Resource Loader“-Suchpfadkette kann er Vorlagen aus einem Dateisystemverzeichnis, dem Klassenpfad, einem velocity/-Unterverzeichnis des conf/-Verzeichnisses (entweder im Dateisystem oder in ZooKeeper) und optional sogar aus Anfrageparametern beziehen. Standardmäßig sind die Vorlagen nur so konfiguriert, dass sie vom Solr-Ressourcenlader stammen, der sie aus conf/velocity/ oder aus dem Klassenpfad (einschließlich der in solrconfig.xml konfigurierten JAR-Dateien oder -Verzeichnisse) zieht. Die integrierten Vorlagen befinden sich in der JAR-Datei solr-velocity. Diese Vorlagen können auch während der Ausführung von Solr nach conf/velocity extrahiert werden, damit sie angepasst werden können. Um die integrierten Vorlagen in das Verzeichnis conf/velocity Ihrer Sammlung zu extrahieren, können Sie den folgenden Befehl verwenden, wobei wir von der Sammlung „example“ ausgehen, mit der wir hier arbeiten.
$ unzip dist/solr-velocity-*.jar velocity/*.vm -d server/solr/example/conf/
Dieser Trick funktioniert, wenn Solr im Standalone-Modus läuft. Im SolrCloud-Modus befindet sich conf/ in ZooKeeper, ebenso wie conf/velocity/ und die zugrundeliegenden Vorlagendateien. Wenn Sie Ihre Änderungen an einer Vorlage nicht sehen, stellen Sie sicher, dass sich die Vorlage dort befindet, wo Solr sie sucht, was möglicherweise ein Hochladen in ZooKeeper erfordert. Nachdem Sie diese Vorlagen aus der JAR-Datei extrahiert haben, können Sie sie nun nach Ihren Wünschen bearbeiten. Vorlagendateien verwenden die Endung .vm, die für „Velocity macro“ steht („macro“ ist leider etwas überladen, am besten nennt man sie „Template“-Dateien). Lassen Sie uns demonstrieren, wie Sie das Solr-Logo oben links in ein Lupen-Clipart-Bild ändern. Öffnen Sie server/solr<div id="head">
wie folgt, speichern Sie die Datei und aktualisieren Sie /browse in Ihrem Browser:
<div id="head"> <a href="#url_for_home"> <!-- Borrowed from https://commons.wikimedia.org/wiki/File:Twemoji_1f50e.svg --> <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Twemoji_1f50e.svg/50px-Twemoji_1f50e.svg.png"/> </a> </div>
#Tipp: Ihr Chef wird sich freuen, wenn er das Firmenlogo auf Ihrem schnellen Solr-Prototyp sieht. Vergessen Sie auch die Farben nicht: Die CSS-Stile können in head.vm angepasst werden.
Ergebnisliste anpassen
Die /browse-Ergebnisliste wird mit der Datei results_list.vm wiedergegeben, die einfach alle „Treffer“ in der Antwort (die aktuelle Seite der Dokumente) durchläuft und hit.vm für jedes Ergebnis wiedergibt. Die Darstellung eines Dokuments in den Suchergebnissen ist in der Regel ein Bereich, der einige domänenspezifische Aufmerksamkeit erfordert. Die extrahierten Vorlagen werden nun verwendet und haben Vorrang vor den eingebauten Vorlagen. Alle Vorlagen, die Sie nicht anpassen müssen, können Sie entfernen und auf die Standardvorlagen zurückgreifen. In diesem Beispiel war die geänderte Vorlage spezifisch für den Kern „Beispiel“. Bei neu erstellten Sammlungen, auch bei datengesteuerten Sammlungen, wird diese Vorlage nicht geändert.
HINWEIS: Die vorgenommenen Änderungen gehen verloren, wenn Sie die Beispielsammlung löschen – siehe die Technik
-Dvelocity.template.base.dir
zum Auslagern von Vorlagen aus der Konfiguration.
Fehlersuche/Fehlerbehebung
Ich verwende /browse gerne für die Fehlersuche und -behebung. In der Fußzeile der Standardansicht gibt es einen Link „Debug aktivieren“, der der aktuellen Suchanfrage ein „debug=true“ hinzufügt. Die /browse-Vorlagen fügen einen Link „geparste Abfrage umschalten“ unter dem Suchfeld und einen Link „explain umschalten“ bei jedem Suchergebnistreffer hinzu. Wenn Sie nach „Facettierung“ suchen, Debug aktivieren und die geparste Abfrage einschalten, erfahren wir, wie die Abfrage des Benutzers interpretiert wurde, einschließlich der Felder, die ins Spiel kommen, und der Analyseumwandlungen, wie z. B. Stemming oder das Entfernen von Stoppwörtern, die stattgefunden haben.
Wenn Sie die Option explain für ein Dokument einschalten, erhalten Sie eine detaillierte Erklärung auf Lucene-Ebene, wie dieses Dokument gefunden und die Relevanzbewertung berechnet wurde. Wie unten gezeigt, erscheint „faceting“ im Feld _text_
(ein data_driven_configs copyField Ziel für alle Felder, das alles durchsuchbar macht). „faceting“ kommt in diesem speziellen Dokument 4 Mal vor (tf, Termfrequenz) und in insgesamt 24 Dokumenten (docFreq, Dokumentfrequenz). Der Faktor fieldNorm kann besonders wichtig sein. Ein Faktor, der auf der Anzahl der Begriffe im Feld basiert, gibt kürzeren Feldern im Allgemeinen einen Relevanzvorteil gegenüber längeren.
Fazit
VelocityResponseWriter: Er ist nicht für jeden oder jeden Anwendungsfall geeignet. Das gilt auch für wt=xml
. Im Laufe der Jahre hat /browse den Vorwurf bekommen, ein „Spielzeug“ oder nicht „produktionstauglich“ zu sein. Es ist beides, und noch einiges mehr. VelocityResponseWriter wurde verwendet für:
- Effektive Verkaufsdemos
- schnelle Prototypenerstellung
- Stromversorgung der gesamten Benutzeroberfläche eines unserer Lucidworks Fusion-Kunden über den sicheren Fusion-Proxy
- und sogar nächtliche E-Mails von einer Website zur Stellensuche generieren!
Letztendlich dient wt=velocity
dazu, aus einer Solr-Anfrage eine Textausgabe (nicht unbedingt HTML) zu erzeugen.