Wie man die Relevanz eines Dokuments in Solr abstimmt
Bei meiner Arbeit bei Lucid Imagination fragte mich einmal ein Kunde, wie er die Bewertung der Dokumente in Solr ändern…
Bei meiner Arbeit bei Lucid Imagination fragte mich einmal ein Kunde, wie er die Bewertung der Dokumente in Solr ändern könne, um die relevantesten Ergebnisse weiter oben in der Ergebnisliste zu erhalten. Während ich versuchte, die Frage zu beantworten, wurde mir klar, dass es zu viele verschiedene Optionen gibt und dass nicht alle davon leicht zu verstehen sind. Also beschloss ich, einige Notizen zu schreiben, in denen ich die gängigsten/meistgenutzten Möglichkeiten zusammenfasste. Danach wurde mir immer wieder dieselbe Frage gestellt, so dass ich beschloss, diese Notizen in einen Blogbeitrag zu verwandeln.
Es gibt zwei Phasen, in denen Dokumente geboostet werden können: Zur Indexzeit und zur Abfragezeit.
Zur Indexzeit
Dies ist wahrscheinlich der einfachste Weg, da es nicht allzu viele Optionen gibt. Es ist auch die statischste Art, Boosts hinzuzufügen, da eine Änderung des Boosts für ein Dokument eine Neuindizierung erfordern würde.
Wenn Sie Dokumente mit dem XMLUpdateRequestHandler aktualisieren, können Sie ein Dokument mit dem optionalen Attribut „boost“ zum doc-Element hinzufügen. Wenn Sie SolrJ verwenden, können Sie dies mit der Methode
document.setDocumentBoost(x)
Die Standardverstärkung für ein Feld ist 1. Wenn Sie also einen Wert zwischen 0 und 1 einstellen, wird das Dokument nach unten verstärkt.
Es ist auch möglich, verschiedenen Feldern eines Dokuments unterschiedliche Boosts hinzuzufügen. Die einzige Voraussetzung hierfür ist, dass die geboosteten Felder die Normen speichern müssen (das Attribut „omitNorms“ im Schema muss auf „false“ gesetzt sein). Die Anwendung der Boosts bei Verwendung des XMLUpdateRequestHandlers ähnelt dem Boosten des gesamten Dokuments, aber anstatt das Attribut „boost“ dem doc-Element hinzuzufügen, fügen Sie es dem Feld-Element hinzu. Bei der Verwendung von SolrJ:
document.addField(“title”, “Foo Bar”, x);
Es ist wichtig zu wissen, dass der Boost (entweder für ein Dokument oder für ein Feld) bei der Berechnung der Endpunktzahl für ein Dokument bei einer Suche berücksichtigt wird. Es ist nicht die endgültige Bewertung des Dokuments. Das Boosten von Dokumenten ist nicht dasselbe wie das Sortieren von Dokumenten.
Zur Abfragezeit
Das Boosten zur Abfragezeit ist etwas anders als zur Indexzeit. Es ist viel dynamischer, da es keine Neuindizierung erfordert und bei jeder neuen Anfrage an Solr angegeben werden kann. Außerdem ist das, was geboostet wird, nicht ein Dokument oder ein Feld, sondern eine Unterabfrage der Suche. Der einfachste Weg, die Abfragezeit zu erhöhen, ist die Verwendung des Zeichens ^ plus der Boost-Nummer in der Abfrage, zum Beispiel:
foo^5 bar
Es können auch viel komplexere Ausdrücke zur Verbesserung der Abfragezeit verwendet werden, wie z.B.:
Titel:(foo bar)^5 OR Inhalt:(foo bar)^2 OR foo OR bar
title:(foo bar)^5 OR title: „foo bar“^20 OR …
Die Syntax kann für einfache Fälle sehr einfach sein, aber sie wird mit komplexeren Anwendungsfällen immer komplexer.
Die obige Syntax ist die Abfragesyntax von Lucene. Sie wird vom Lucene Query Parser und vom Extended Dismax Query Parser unterstützt, nicht aber vom Dismax Query Parser.
Diese Syntax erfordert jedoch einen erfahrenen Benutzer, der weiß, wie man sie verwendet, oder eine Anwendungslogik, die sie im Hintergrund einfügt, nachdem der Benutzer die Abfrage eingegeben hat und bevor sie an Solr gesendet wird. Dismax bietet andere Alternativen für die Verbesserung der Abfragezeit, die ebenso dynamisch sind wie die vorherige, aber eine viel einfachere Syntax haben (alle werden auch von Extended Dismax unterstützt).
Steigerung der Abfragezeit mit dem Dismax Query Parser
Felder ankurbeln
Der Dismax Query Parser (QP) erstellt eine Abfrage, die auf vielen verschiedenen Feldern ausgeführt wird, auch wenn der Benutzer keine Felder angegeben hat. Dies ist eine der wichtigsten Verbesserungen des Dismax QP gegenüber dem Lucene QP. Aber manchmal haben nicht alle Felder die gleiche Bedeutung. Manchmal ist ein Treffer im Titelfeld wichtiger als ein Treffer im Inhaltsfeld , oder ein Treffer im Inhaltsfeld kann wichtiger sein als ein Treffer im Kommentarfeld. Der Dismax Query Parser bietet die Möglichkeit, einige Felder als wichtiger zu betrachten als andere, und zwar mit dem Parameter „qf“ (benannt nach „query fields“, d.h. Abfrage-Felder), der auch für die Angabe der verschiedenen Felder verwendet wird, auf denen die Benutzerabfrage ausgeführt werden soll. Ein üblicher Wert für diesen Parameter könnte sein:
qf=Titel^5 Inhalt^2 Kommentare^0.5
Damit wird eine Benutzeranfrage wie „boo bar“ in etwas Ähnliches übersetzt:
Titel:(foo bar)^5 OR Inhalt:(foo bar)^2 OR Kommentare:(foo bar)^0.5
Verstärkende Phrasen
Genau wie bei den Abfragefeldern führt der Dismax Query Parser die Benutzerabfrage als Phrasenabfrage auf den angegebenen „Phrasen“-Feldern aus. In diesem Parameter kann, ähnlich wie beim qf-Parameter, für jedes der Phrasenfelder eine andere Verstärkung angegeben werden:
pf=Titel^20 Inhalt^10
Damit wird eine Benutzerabfrage wie foo bar in übersetzt:
Titel: „foo bar“^20 OR Inhalt: „foo bar“^10
Die letzte Abfrage wird nur zum Boosten der Dokumente verwendet, die sich aus der ursprünglichen Abfrage ergeben.
Boost-Abfragen
Manchmal ist es notwendig, einige Dokumente unabhängig von der Benutzeranfrage zu boosten. Ein typisches Beispiel für Boost-Anfragen ist das Boosten von gesponserten Dokumenten. Der Benutzer sucht nach „Autovermietung“, aber die Anwendung hat einige gesponserte Dokumente, die geboostet werden sollen. Eine gute Möglichkeit, dies zu tun, ist die Verwendung von Boost-Abfragen. Eine Boost-Abfrage ist eine Abfrage, die im Hintergrund nach einer Benutzerabfrage ausgeführt wird und die Dokumente, die mit ihr übereinstimmen, anhebt.
In diesem Beispiel würde die Boost-Abfrage (angegeben durch den Parameter „bq“) etwa so lauten:
bq=gesponsert:true
Die Boost-Abfrage bestimmt nicht, welche Dokumente als Treffer gewertet werden und welche nicht, sondern sie beeinflusst lediglich die Punktzahl des Ergebnisses.
Boost-Funktionen
Boost-Funktionen sind den Boost-Abfragen sehr ähnlich; tatsächlich können sie die gleichen Ziele erreichen. Der Unterschied zwischen Boost-Funktionen und Boost-Abfragen besteht darin, dass es sich bei der Boost-Funktion um eine beliebige Funktion und nicht um eine Abfrage handelt (siehe http://lucidworks.lucidimagination.com/display/solr/Function+Abfragen). Ein typisches Beispiel für Boost-Funktionen ist das Boosten von Dokumenten, die aktueller sind als andere. Stellen Sie sich eine Forensuchanwendung vor, bei der der Benutzer nach Foreneinträgen mit dem Text „foo bar“ sucht. Die Anwendung sollte alle Foreneinträge anzeigen, die sich mit „foo bar“ befassen, aber in der Regel sind die aktuellsten Einträge wichtiger (die meisten Benutzer möchten aktuelle Einträge sehen und nicht historische). Die Boost-Funktion wird nach jeder Benutzerabfrage im Hintergrund ausgeführt und wertet einige Dokumente in irgendeiner Weise auf.
Für dieses Beispiel könnte eine Boost-Funktion (angegeben durch den Parameter „bf“) etwa so aussehen:
bf=recip(ms(NOW,publicationDate),3.16e-11,1,1)
Genau wie bei den Boost-Abfragen bestimmt diese Funktion nicht, welche Dokumente ein Treffer sind und welche nicht, sie fügt ihnen lediglich eine zusätzliche Punktzahl hinzu.
Ein Hinweis zu boost-Funktionen: boost-Funktionen können auch mit der Lucene QP verwendet werden, indem Sie den speziellen Schlüssel „_val_“ innerhalb der Abfrage verwenden.
Tie Breaker
Der Parameter „Gleichstand“ (tie breaker) ist sehr wichtig, aber nicht leicht zu verstehen. Zunächst ist es wichtig zu verstehen, was ein Dismax(http://www.lucidimagination.com/post/whats-a-dismax/) ist. Bei DisMax-Abfragen werden die verschiedenen Begriffe der Benutzereingabe in verschiedenen Feldern abgefragt. Wenn viele von ihnen einen Treffer erzielen (der Begriff kommt in verschiedenen Feldern desselben Dokuments vor), wird der Treffer mit der höheren Punktzahl verwendet, aber was geschieht mit den anderen Unterabfragen, die in diesem Dokument für den Begriff einen Treffer erzielen? Nun, genau das definiert der Parameter „Gleichstand“. DisMax berechnet die Punktzahl für eine Begriffsabfrage wie folgt:
score= [score of the top scoring subquery] + tie * (sum of other hitting subqueries)
Folglich ist der Parameter „tie“ ein Wert zwischen 0 und 1, der festlegt, ob Dismax nur den maximalen Trefferwert für einen Begriff (Einstellung tie=0), alle Treffer für einen Begriff (Einstellung tie=1) oder etwas zwischen diesen beiden Extremen berücksichtigen soll.
Der Boost Parameter
Der Parameter „boost“ ist dem Parameter „bf“ sehr ähnlich, aber anstatt sein Ergebnis zum Endergebnis zu addieren, wird es damit multipliziert. Diese Funktion ist nur im „Extended Dismax Query Parser“ oder im „Lucid Query Parser“ verfügbar.
Ein Hinweis zu den Parametern
Alle oben genannten Parameter können bei der Konfiguration von Solr (in der Datei solrconfig.xml) angegeben werden. Sie können aber auch bei jeder Anfrage geändert werden, indem Sie den Parameter mit dem neuen Wert an die Anfrage senden.