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ür facet.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 5 Startbahnhöfe mit den beliebtesten Zielen für jeden
Station Fahrten Mittlere Dauer
Pershing Square N 1075 13.5 Minuten
⇒ Broadway & W 32 St 32 8.4 Minuten
Lafayette St & E 8 St 984 13.2 Minuten
⇒ E 17 St & Broadway 35 5.5 Minuten
E 17 St & Broadway 971 12.2 Minuten
⇒ W 21 St & 6 Ave 16 6.1 Minuten
W 20 St & 11 Ave 957 13.3 Minuten
⇒ W 17 St & 8 Ave. 25 5.3 Minuten
8 Ave & W 31 St 930 12.8 Minuten
⇒ 8 Ave & W 52 St 24 10.0 Minuten
Top 5 Zielbahnhöfe mit den beliebtesten Starts für jeden
Station Fahrten Mittlere Dauer
Lafayette St & E 8 St ⇒ 35 5.5 Minuten
E 17 St & Broadway 1103 11.7 Minuten
W 17 St & 8 Ave ⇒ 30 6.0 Minuten
8 Ave & W 31 S 973 13.2 Minuten
W 17 St & 8 Ave ⇒ 24 7.3 Minuten
W 20 St & 11 Ave 960 12.2 Minuten
E 10 St & Avenue A ⇒ 23 6.5 Minuten
Lafayette St & E 8 St 930 10.8 Minuten
E 30 St & Park Ave S ⇒ 21 6.0 Minuten
Pershing Square N 840 14.3 Minuten

 

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.

You Might Also Like

B2B-KI-Benchmarkstudie 2025: Was wir in den Schützengräben sehen

Laden Sie die B2B-KI-Benchmark-Highlights 2025 von Lucidworks herunter. Sehen Sie sich die...

Read More

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Quick Links