Solr Statistiken und Felder Facetten
Hinweis: Die in diesem Blogbeitrag besprochenen Features und Funktionen sind in Solr zwar immer noch verfügbar und werden unterstützt, aber…
Hinweis: Die in diesem Blogbeitrag besprochenen Features und Funktionen sind in Solr zwar immer noch verfügbar und werden unterstützt, aber neuen Benutzern wird empfohlen, stattdessen die JSON Facet API zu verwenden, um ähnliche Ergebnisse zu erzielen. Obwohl ihre Genauigkeit in verteilten Sammlungen bei ihrer Einführung in Solr 5.0 etwas begrenzt war, unterstützt die JSON Facet API eine breitere Palette von Funktionen (einschließlich der Möglichkeit, nach verschachtelten Statistikfunktionen zu sortieren). Mit der Hinzufügung der (zweistufigen) Verfeinerungsunterstützung in Solr 7.0 und der konfigurierbaren overrefine
in 7.5 gibt es für Benutzer praktisch keinen Grund mehr, facet.pivot
oder stats.field
.
Solr unterstützt grundlegende„Field Facets“ schon sehr lange. Solr unterstützt auch„Feldstatistiken“ über numerische Felder schon (fast) genauso lange. Aber ab Solr 5.0 (aufbauend auf der großartigen Arbeit, die zur Unterstützung von Distributed Pivot Faceting in Solr geleistet wurde) wird es nun möglich sein, Field Stats für jedes Constraint eines Pivot Facets zu berechnen. Heute möchte ich Ihnen erklären, was das bedeutet und wie es für Sie nützlich sein könnte.
Facetten
„Field Faceting“ ist für die meisten Solr-Benutzer hoffentlich ein ziemlich einfaches Konzept. Für jede Abfrage können Sie Solr FacetComponent
auch bitten, die wichtigsten „Begriffe“ aus einem Feld Ihrer Wahl zu berechnen und diese Begriffe zusammen mit der Kardinalität der Teilmenge von Dokumenten, die diesem Begriff entsprechen, zurückzugeben.
Ein kleines triviales Beispiel: Wenn Sie eine Reihe von Dokumenten haben, die „Bücher“ repräsentieren, und Sie eine Abfrage nach Büchern zum Thema „Kriminalität“ durchführen, können Sie Solr anweisen, das Feld author
zu facettieren. Solr könnte Ihnen dann mitteilen, dass es 1024 Bücher gefunden hat, die der Abfrage q=Crime
entsprechen, und dass der am häufigsten gefundene Autor dieser Bücher „Kaiser Soze“ ist, der „42“ dieser Bücher geschrieben hat. Wenn Sie Ihre Ergebnisse anschließend mit fq=author:"Kaiser Soze"
filtern, sollten Sie nur 42 Ergebnisse erhalten.
http://localhost:8983/solr/books/select?q=Crime&facet=true&facet.field=author ... "facet_counts":{ "facet_queries":{}, "facet_fields":{ "author":[ "Kaiser Soze",42, "James Moriarty",37, "Carmine Falcone",25, ...
Statistiken
„Field Stats“ ist eine Funktion von Solr, mit der viele Benutzer vielleicht nicht sehr vertraut sind. Mit dieser Funktion können Sie Solr anweisen, die StatsComponent zu verwenden, um für alle Dokumente, die einer Abfrage entsprechen, eine aggregierte Statistik für ein numerisches Feld zu berechnen. Die unterstützten Statistiken sind:
- min
- Durchschnitt
- max
- Summe
- count (Anzahl der eindeutigen Werte, die in dem Feld für diese Dokumente gefunden wurden)
- missing (Anzahl der Dokumente in der Ergebnismenge, die keinen Wert in diesem Feld haben
- stddev (Standardabweichung)
- sumOfSquares (Zwischenergebnis für die Berechnung von stddev, für die meisten Benutzer nicht nützlich)
Um also unser vorheriges Beispiel fortzusetzen: Wenn Sie Ihre Suche nach q=Crime
können Sie Solr mitteilen, dass Sie die Statistiken über die price
Feld und sehen Sie sich die min
, mean
, max
, und stddev
Werte, um eine Vorstellung davon zu bekommen, wie teuer Bücher über Verbrechen sind.
http://localhost:8983/solr/books/select?q=Crime&stats=true&stats.field=price ... "stats":{ "stats_fields":{ "price":{ "min":12.34, "max":57.65, "mean":34.56, ...
Sie haben Ihre Facetten in meiner Statistik!
Seit dem Beginn seiner Existenz hat der StatsComponent
hat eine rudimentäre Unterstützung für die Generierung von „Sub-Facetten“ über ein Feld mit Hilfe der Methode stats.facet
param. Dies erzeugt eine einfache Liste von Facettenbegriffen und berechnet die Statistiken über jede Teilmenge. Um unser früheres Beispiel fortzusetzen, könnten die Ergebnisse etwa so aussehen….
http://localhost:8983/solr/books/select?q=Crime&stats=true&stats.field=price&stats.facet=author ... "stats":{ "stats_fields":{ "price":{ "min":12.34, "max":57.65, "mean":34.56, ... "facets":{ "author":{ "Carmine Falcone":{ "min":22.50, "max":37.50, ... }, ... "James Moriarty":{ "min":19.95, "max":39.95, ...
Aber dieser stats.facet
Ansatz war schon immer mit Problemen behaftet:
- Völlig anderer Code als
FacetComponent
, der schwer zu pflegen war und keine verteilte Suche unterstützt (siehe EDIT#1 unten) - Gibt immer alle Begriffe aus dem Feld
stats.facet
zurück, ohne Unterstützung fürfacet.limit
,facet.sort
, usw… - Viele Probleme mit mehrwertigen Facettenfeldern und/oder Nicht-String-Facettenfeldern.
Sie haben Ihre Statistiken in meinen Facetten!
Eine der neuen Funktionen in Solr 5.0 wird die Möglichkeit sein , einen stats.field
mit einem facet.pivot
param zu „verknüpfen“ – dies kehrt die Beziehung um, die stats.facet
anbieten (sozusagen die Verschachtelung der Statistiken unter den Facetten, anstatt die Facetten unter die Statistiken zu setzen), so dass die FacetComponent
übernimmt die schwere Arbeit der Bestimmung der Facettenbeschränkungen und delegiert an die StatsComponent
nur so viel wie nötig, um Statistiken über die Teilmenge der Dokumente für jede Einschränkung zu berechnen. (Die Erdnussbutter auf der Innenseite der Schokolade zu haben, ist viel weniger chaotisch als die Alternative).
Für unser vorheriges Beispiel bedeutet dies, dass Sie folgende Ergebnisse erhalten könnten…
http://localhost:8983/solr/techproducts/select?q=crime&facet=true&stats=true&stats.field={!tag=t1}price&facet.pivot={!stats=t1}author ... "facet_pivot":{ "author":[{ "field":"author", "value":"Kaiser Soze", "count":42, "stats":{ "stats_fields":{ "price":{ "min":12.95, "max":29.95, ...}}}}, { "field":"author", "value":"James Moriarty", "count":37, "stats":{ "stats_fields":{ "price":{ "min":19.95, "max":39.95, ...
Der Verknüpfungsmechanismus erfolgt über einen tag
Local Param, der auf stats.field
angegeben ist. Dadurch können mehrere facet.pivot
Params auf denselben stats.field
verweisen oder ein einziger facet.pivot
auf mehrere verschiedene stats.field
Params über verschiedene Felder/Funktionen, die alle denselben tag
verwenden, usw. Und da diese Funktionalität auf Pivot-Facetten aufbaut, können mehrere Ebenen von Pivots berechnet werden, wobei die Statistiken auf jeder Ebene berechnet werden. Weitere Einzelheiten finden Sie im Solr-Referenzhandbuch.
Die Teile zusammenfügen: CitiBike
Die Beispiele, die ich bisher genannt habe, waren ziemlich einfach und konstruiert, aber wenn Sie sich für einige sehr coole Anwendungen der neuen Pivot+Stats-Funktionalität interessieren, sollten Sie sich das„Solr For DataScience„-Repositorium ansehen, das Grant Ingersoll für eine kürzlich gehaltene Präsentation mit den Nutzungsdaten des NYC CitiBike zusammengestellt hat.
Mit der kleinen Stichproben-Datenuntermenge (Fahrradnutzung von Juli bis Oktober 2013), die in der Sammlung citi_py
(siehe ./index-py.sh
) indiziert ist, können Sie die folgenden Abfragen verwenden, um die Antworten auf einige nicht-triviale Fragen zu finden. Zum Beispiel…
Beliebteste Reisen für Abonnenten, mit durchschnittlicher Dauer
Ermitteln Sie für alle Fahrten, die von Abonnenten unternommen werden, die 5 wichtigsten Startbahnhöfe mit dem jeweils häufigsten Endbahnhof sowie die 5 wichtigsten Endbahnhöfe und den jeweils häufigsten Startbahnhof. Berechnen Sie Statistiken über die Fahrtdauer (in Sekunden) für jedes dieser Bahnhofspaare.
101202 Fahrten von Abonnenten insgesamt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Top-Ziele für männliche und weibliche Abonnenten, die von der NYU abreisen, mit Durchschnittsalter des Fahrers
Ermitteln Sie für alle Fahrten von Abonnenten, die an einem der 5 Bahnhöfe in der Nähe der NYU beginnen, die 5 wichtigsten Zielbahnhöfe für jedes Geschlecht sowie das Durchschnittsalter des Fahrers zu jedem dieser Bahnhöfe.
2189 Fahrten insgesamt ab NYU, Top 5 Zielbahnhöfe nach Geschlecht | ||||||
(1658) Männlich | (531) Weiblich | |||||
Trips | Reiseziel | Mittleres Alter | Trips | Reiseziel | Mittleres Alter | |
54 | University Pl & E 14 St | 35 Jahre | 27 | University Pl & E 14 St | 34 Jahre | |
39 | E 12 St & 3 Ave | 29 Jahre | 11 | Broadway & E 14 St | 39 Jahre | |
31 | Lafayette St & E 8 St | 39 Jahre | 9 | E 10 St & Avenue A | 37 Jahre | |
29 | Mercer St & Bleecker St | 37 Jahre | 9 | E 17 St & Broadway | 35 Jahre | |
28 | LaGuardia Pl & W 3 St | 39 Jahre | 9 | Washington Square E | 41 Jahre |
Wohin wir von hier aus gehen
Es sind noch viele Verbesserungen in der Pipeline, um Feldstatistiken mit Facettierung zu verknüpfen (z.B.: Kombination von Statistiken mit Bereichsfacettierung, Kombination von Bereichsfacettierung mit Pivot-Facettierung usw.) sowie Pläne, mehr Optionen für die Statistiken zu unterstützen (z.B.: Begrenzung der berechneten Statistiken, Erzeugung von Perzentil-Histogrammen usw.). All diese Arbeiten werden in SOLR-6348 und den zugehörigen Sub-Tasks verfolgt. Bitte verfolgen Sie diese Themen in Jira, um die zukünftige Entwicklung zu verfolgen – wir können immer mehr Leute gebrauchen, die Patches testen!
EDIT#1: In einer früheren Version dieses Beitrags hieß es, dass stats.facet
keine verteilte Suche unterstützt – das war falsch. Das Problem, an das ich gedacht habe, ist, dass die Art und Weise, wie die Stats-Komponente arbeitet und mit verteilten Anfragen umgeht, davon abhängt, dass alle Daten aus jedem Shard in einem einzigen Durchgang zurückgegeben werden – was sich auf den zweiten Punkt bezieht („Gibt immer jeden Begriff aus dem Feld stats.facet
zurück…“). Es war/ist praktisch unmöglich, stats.facet
so zu ändern, dass es diese Parameter unterstützt, oder es an den bestehenden Facet-Code zu delegieren (der Verfeinerungsanfragen verwendet, um genaue Zählungen zu erhalten), so dass genaue stats.facet
Zählungen bei der verteilten Suche weiterhin unterstützt werden.