Solr-gestützte ISFDB – Teil #11: DisMax verwenden

Dies ist Teil 11 einer (nicht enden wollenden?) Artikelserie über das Indizieren und Durchsuchen der ISFDB.org-Daten mit Solr.

Beim letzten Mal hatten wir eine bereichsspezifische Verzerrungsfunktion verwendet, um die Reihenfolge unserer Ergebnisse zu verbessern, so dass beliebte Autoren und Titel an der Spitze der Ergebnisse auftauchten. Heute werden wir uns die Verwendung von DisMax ansehen, um weitere Verbesserungen zu erzielen.

(Wenn Sie zu Hause mitarbeiten möchten, können Sie den Code auf github auschecken. Ich beginne mit dem blog_10 Tag und werde im Laufe des Artikels auf bestimmte Commits verweisen, in denen ich etwas geändert habe, bis hin zum blog_11 Tag, der das Endergebnis dieses Artikels enthält).

Beliebt != Was ich will

Die Verwendung einer auf der Popularität basierenden Bewertung hat uns einige schnelle Erfolge gebracht, indem wir „gute“ Dokumente einfach auftauchen ließen. Diese Art von Lösung ist bei Produktmanagern und Vertriebsmitarbeitern sehr beliebt, da sie das „heiße“ Material an vorderster Stelle zeigt, aber sie kann auch Benutzer verärgern, die sich für den „langen Schwanz“ interessieren. Manchmal suchen sie vielleicht nicht einmal nach der Spitze dieses Schwanzes – nehmen Sie zum Beispiel eine Autorensuche nach Sterling.

Bruce Sterling ist ein beliebter Sci-Fi-Autor, der fast 200 Romane/Geschichten veröffentlicht hat, und jeder, der die ISFDB-Daten durchsucht, würde vernünftigerweise erwarten, dass sein Name das erste Ergebnis für „Sterling“ ist. Da wir einen Filter auf doc_type:AUTHOR haben, würden Sie sicherlich erwarten, dass er an der Spitze einer Liste von Leuten namens Sterling steht.

Stattdessen erhalten wir auf Seite 1 der Ergebnisse…

  1. Ray Bradbury
  2. Bruce Sterling
  3. Gregory Benford
  4. Edmond Hamilton
  5. Terry Brooks
  6. Sterling E. Lanier
  7. Amy Sterling Casil
  8. William Morrison
  9. Sterling Lanier
  10. Kenneth Sterling

…gibt es kaum einen „Sterling“ unter ihnen!

Der Grund dafür ist einfach und klar und lässt sich bereits aus der Benutzeroberfläche ablesen. Wir können sehen, dass „Ray Bradbury“ das Pseudonym „Brett Sterling“ trägt – es ist nicht schwer vorstellbar, dass er beliebter ist als „Bruce Sterling“, und der Erklärungsschalter zeigt uns, dass dies tatsächlich der Fall ist…

  • Ray Bradbury
    451896.44 = (MATCH) boost(catchall:sterling,sum(int(views),int(annualviews))), product of: 8.268163 = (MATCH) weight(catchall:sterling in 560416), product of: 0.99999994 = queryWeight(catchall:sterling), product of: 8.268164 = idf(docFreq=443, maxDocs=636658) 0.12094583 = queryNorm 8.268164 = (MATCH) fieldWeight(catchall:sterling in 560416), product of: 1.0 = tf(termFreq(catchall:sterling)=1) 8.268164 = idf(docFreq=443, maxDocs=636658) 1.0 = fieldNorm(field=catchall, doc=560416) 54655.0 = sum(int(views)=40015,int(annualviews)=14640)
  • Bruce Sterling
    327739.88 = (MATCH) boost(catchall:sterling,sum(int(views),int(annualviews))), product of: 18.488174 = (MATCH) weight(catchall:sterling in 560504), product of: 0.99999994 = queryWeight(catchall:sterling), product of: 8.268164 = idf(docFreq=443, maxDocs=636658) 0.12094583 = queryNorm 18.488176 = (MATCH) fieldWeight(catchall:sterling in 560504), product of: 2.236068 = tf(termFreq(catchall:sterling)=5) 8.268164 = idf(docFreq=443, maxDocs=636658) 1.0 = fieldNorm(field=catchall, doc=560504) 17727.0 = sum(int(views)=12092,int(annualviews)=5635)

Wenn Sie sich die anderen Ergebnisse und ihre Erklärungen zur Punktzahl ansehen, können Sie leicht feststellen, dass Pseudonyme die anderen Ergebnisse auf die gleiche Weise beeinflussen (oder im Fall von Terry Brooks: der Geburtsort „Sterling, Illinois“)

Nicht alle Felder sind gleich

Man könnte leicht in die Falle tappen und einen Divisor für den Popularitätsschub festlegen, um ihn subtiler zu machen. Das Problem ist jedoch, dass wir nach einem „Catchall“-Feld suchen, das den gesamten Text aus allen anderen Feldern enthält, und in Wirklichkeit sind nicht alle Felder gleich. Bruce Sterling hat den Begriff „Sterling“ vielleicht 5 Mal in seinem Catchall-Feld, Ray Bradbury dagegen nur 1 Mal, aber es sollte wirklich darauf ankommen, in welchen Feldern der Begriff vorkommt. Wir könnten unser Catchall-Feld dahingehend ändern, dass es nur den kanonischen Namen eines Autors enthält und nicht seine Pseudonyme, aber das ist eine sehr schwarz/weiß Lösung, die den Leuten schaden würde, die nach Pseudonymen suchen (oder nach Autoren aus Illinois). Was wir brauchen, ist eine Grauschattierung, die es uns ermöglicht, einigen Feldern mehr Gewicht zu geben als anderen

Geben Sie DisMax ein.

DisMax ist ein QParser, über den ich schon einmal geschrieben habe. Wenn Sie alle Details wissen möchten, sollten Sie diesen Artikel lesen. Aber zunächst einmal können Sie mit DisMax verschiedene Felder für die Suche mit unterschiedlicher Gewichtung konfigurieren.

Um die Dinge für den Anfang einfach zu halten, werde ich „Titel“-Dokumente komplett ignorieren und mich nur auf „Autor“-Dokumente konzentrieren (da unterschiedliche Dokumenttypen unterschiedliche Felder enthalten). Ohne meine Konfigurationen zu ändern, kann ich URL-Parameter verwenden, um mit verschiedenen Verwendungen von DisMax zu experimentieren und bestimmte Felder mit unterschiedlichen Gewichtungen zu suchen…


(Hinweis: In diesem letzten Fall müssen wir defType=dismax in die lokalen Parameter des q -Parameters verschieben, so dass er verwendet wird, um den verschachtelten Parser für v=$qq auszuwählen. defType ist nur der Standardtyp des Parsers für die „Haupt“-Abfrage, egal auf welcher Ebene er verwendet wird – er rekursiert nicht zu anderen Abfragezeichenfolgen, die geparst werden)

Wir haben jetzt einige Ergebnisse, die recht anständig aussehen: Übereinstimmungen im Feld canonical_name werden stark gewichtet und als sehr wichtig angesehen, aber Übereinstimmungen überall im Dokument werden immer noch als Ergebnisse zurückgegeben. In Zukunft möchten wir vielleicht den pf Parameter von DisMax besser nutzen, um Felder nur dann stark zu gewichten, wenn sie alle Begriffe in einer Abfrage enthalten, aber im Moment haben wir definitiv eine schrittweise Verbesserung.

Aber was ist mit Titeln?

Bevor wir es aufgeben, müssen wir noch über die Situation bei „Titel“ nachdenken. Wir durchsuchen immer noch das Catchall-Feld, so dass übereinstimmende Titel immer noch zurückgegeben werden, aber da sie keine Chance haben, mit einem der stark gewichteten Felder übereinzustimmen, kann die Punktzahl von DisMax so niedrig sein, dass selbst extrem populäre Titel schlechter abschneiden als Autoren, die zufällig Namen haben, die ihren Titeln ähnlich sind. Ich bin mir sicher, dass Pete Lion sehr hart an der Gestaltung des Covers für das eine Buch gearbeitet hat, an dem er mitgewirkt hat, aber macht es wirklich Sinn, dass eine Suche nach Lion ihn vor The Lion, the Witch and the Wardrobe(der beliebteste Titel in der ISFDB) ergibt?

Ein Ansatz, den wir verfolgen könnten, wäre die Verwendung von copyField Direktiven oder DIH-Transformatoren, um „allgemeinere“ Felder zu erstellen, die in allen Arten von Dokumenten vorhanden sind, und diese in unseren DisMax-Optionen zu verwenden. Möglicherweise werde ich das in Zukunft tun, aber in der Zwischenzeit können wir die Parität für Titeldokumente herstellen, indem wir das Feld title zu qf hinzufügen, mit einer vergleichbaren Steigerung wie bei canonical_name. So erhalten „gute“ Übereinstimmungen bei Titeldokumenten eine anständige Punktzahl.

Zu guter Letzt: Behebung einiger UI-Bugs

Als ich letzte Woche den multiplikativen Boost hinzufügte und auf die Verwendung von qq als Hauptabfrageparameter, habe ich das Boosted q Parameter als „invariant“, so dass er immer angewendet wird und niemals überschrieben werden kann. Das funktioniert gut, und ich habe das Textfeld in der Benutzeroberfläche aktualisiert, damit es über qq Bescheid weiß, aber ich habe vergessen, etwas für die Felder „Alle Titel anzeigen“, „Pseudonyme: „, „Echter Name: “ und „Autor: “ Links, die in den Ergebnissen erstellt werden. Sie versuchen immer noch, einen q -Parameter anzugeben, der ignoriert wird.

Da ich DisMax als QParser für den qq -Parameter verwende, wird eine einfache Suche und Ersetzung von „q=“ in „qq=“ hier nicht wirklich funktionieren (das könnte es wahrscheinlich, wenn ich „edismax“ verwenden würde, aber das ist ein Thema für einen anderen Tag). Stattdessen werde ich das tun, was ich wahrscheinlich von vornherein hätte tun sollen, als ich diese Links hinzugefügt habe: Ich verwende fq für diese Links und verlasse mich auf die Standardabfrage (die jetzt für DisMax mit q.alt festgelegt wurde).

Der andere „Fehler“, den ich heute beheben wollte, ist der Fehler in meinem Gehirn, der es mir irgendwie ermöglicht hat, bei der Arbeit an diesem Projekt so weit zu kommen, ohne jemals einen externen Link von jedem Suchergebnis zur Hauptseite von ISFDB.org für den jeweiligen Autor/Titel hinzuzufügen. Ich bin mir nicht sicher, warum ich das nicht schon früher getan habe, aber es war ein relativ einfaches kleines Stück UI-Markup (obwohl es eine kleine Makro-Änderung wegen einiger Merkwürdigkeiten bei der Behandlung von Leerzeichen erforderte).

Fazit (vorläufig)

Und damit ist diese neueste Ausgabe des blog_11-Tags abgeschlossen. Wir haben jetzt einige viel besser aussehende Ergebnisse für verschiedene Suchanfragen, indem wir DisMax für die Suche nach verschiedenen Feldern mit unterschiedlich gewichteter Bedeutung verwenden.

Eine letzte Anmerkung: Es ist wichtig, sich klarzumachen, dass die Gewichte, die ich für diese Felder gewählt habe, nichts Besonderes sind. Es sind keine magischen Zahlen, ich habe nicht viel darüber nachgedacht und ich habe mich nicht auf eine bestimmte Weisheit oder Erfahrung gestützt (die ich in diesem Artikel nicht mitgeteilt habe), um zu entscheiden, wie sie sein sollten. Ich habe einfach Zahlen ausgewählt, die mir auf den ersten Blick gut aussehen. Die erzielten Ergebnisse sind unwichtig. Wichtig ist nur, dass die in qf verwendeten Gewichte gut miteinander und mit dem multiplikativen Schub durch die Popularität zusammenspielen. Wenn die Beliebtheitswerte um einige Größenordnungen ansteigen, sind diese Werte möglicherweise nicht mehr nützlich. In einer idealen Welt würde ich eine Reihe von Relevanztests einrichten, eine Analyse der Klickraten durchführen und ein Team von Hilfsaffen einsetzen, die die Beliebtheit von Suchanfragen überprüfen – aber für ein persönliches Ein-Mann-Projekt scheinen die bisherigen Ergebnisse ziemlich gut zu sein.

You Might Also Like

KI-Agenten dominieren den Einkauf. Ist Ihre Website auf die KI-gestützte Suche vorbereitet?

Generative KI-Agenten wie ChatGPT definieren die Produktsuche neu. Erfahren Sie, wie Sie...

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