Bild-Schulung-Solr-in-a-Nutshell

Sortierung mal anders

Die richtige Reihenfolge der Dokumente innerhalb der Trefferliste zu erreichen ist ein schwieriges Ziel. Da wird an allen Ecken und Enden geboostet, es wird der Relevanzalgorithmus umgeschrieben oder gar mit dem Elevate Feature gearbeitet. Trotz all dieser Möglichkeiten steht man oft vor der Situation, dass es dennoch nicht passt.

In diesem Blog möchte ich auf eine neue Möglichkeit eingehen, mit der man eine Sortierung durchführen kann, bei der man die Reihenfolge per Konfiguration selbst vorgeben kann.

EnumField

Oft haben wir in unseren Solr Projekten relativ einfache Anforderungen an das Sortieren: „Sortiere die Trefferliste, nach dem Inhalt eines bestimmten Feldes, jedoch nicht in alphabetischer Reihenfolge oder nach Häufigkeit, sondern nach einer definierten Gewichtung der Inhalte. Bisher mussten wir uns hier in den meisten Fällen mit External-File-Fields behelfen und eine entsprechende Lösung generieren.
Mit der Solr Version 4.6 wurde ein neuer Feldtyp eingeführt, mit dem man die Sortierung manuell beeinflussen kann. Der Enum-Feldtyp wurde dafür so designed, dass er eine XML-Datei als Konfiguration einliest und die Sortierung basierend auf der Reihenfolge der Werte der Konfiguration durchführt. Dadurch kann eine Sortierung umgesetzt werden, die losgelöst vom Alphabet und von der Häufigkeit des Vorkommens in der Trefferliste ist.
Die Konfiguration des Feldtyps ist zweiteilig aufgebaut. Zum einem, muss in der schema.xml-Datei Feld und Feldtyp definiert werden und zweitens, muss ein Mapping bzw. die Reihenfolge der Sortierung definiert werden.

Der Ausfall

Durch einen Stromausfall in dem Gebäude, in dem Server host2 beheimatet ist, fällt der Server – und damit der Solr-Knoten host2:8983_solr – aus. Der Ausfall hat vorerst keine fehlerproduzierenden Auswirkungen, da sowohl alle Indexierungsprozesse als auch alle Suchanfragen weiterhin korrekt abgearbeitet werden. Dennoch beeinflusst der Ausfall die Antwortzeiten auf Suchanfragen negativ, da nunmehr lediglich einer statt zwei Solr-Knoten die hohe Anzahl an Suchanfragen an die eine Shard der Collection bearbeiten kann.

schema.xml
<fieldtype name="priority" class="solr.EnumField" enumsConfig="enum.xml" enumName="priority"/>
 <field name="priority" type="priority" indexed="true" stored="true" />

Im obigen Beispiel wird ein Enum-Feld definiert, dessen Konfiguration in einer Datei mit dem Namen enum.xml abgelegt wurde.

enum.xml
< ?xml version="1.0"?>
<enumsconfig>
 <enum name="priority">
 <value>Sehr Hoch</value>
 <value>Hoch</value>
 <value>Mittel</value>
 <value>Niedrig</value>
 <value>Sehr Niedrig</value>
 </enum>
 <enum name="gender">
 ...
 </enum>
 </enumsconfig>

In der obigen Konfiguration sind fünf unterschiedliche Werte für die Priorität definiert worden. Neben dem enum-Element mit dem Namen „priority“ können weitere Enums definiert werden, wenn man mehrere Felder von diesem Typ benötigt. Dies erspart einem die Pflege vieler unterschiedlicher Dateien.
Die Reihenfolge bei der Sortierung ergibt sich aus der Reihenfolge der Elemente, d.h. es werden zuerst alle Dokument mit dem Wert „Sehr Hoch“, dann die Dokumente mit dem Wert „Hoch“ usw. angezeigt.
Bei der Indexierung muss man nicht viel beachten. Man muss, wie im folgenden Beispiel dargestellt, nur die entsprechenden Werte indexieren.

<add>
 <doc>
 <field name="id">1</field>
 <field name="priority">Hoch</field>
 </doc>
 <doc>
 <field name="id">2</field>
 <field name="priority">Sehr Hoch</field>
 </doc>
</add>

Eine einfache Suche mit einer Sortierung wird nun das Dokument mit der id „2“ vor dem Dokument mit der id „1“ anzeigen.

https://localhost:8983/solr/collection1/select?q=*:*&sort=priority+asc

Fazit


Dieser Feldtyp ist noch sehr frisch, aber da steckt eine Menge Potenzial darin. Ich bin gespannt, was unsere Tests bezüglich des Speicherverbrauchs bei diesem Feldtyp zeigen. Vor allem dann, wenn wir es mit vielen Dokumenten zu tun haben; auch hier verspreche ich mir eine Verbesserung gegenüber der alten Situation.
In der aktuellen Implementierung fehlt die Möglichkeit die Reihenfolge in der XML-Datei dynamisch zu verändern. Wenn die Reihenefolge in der XML-Datei verändert wird, muss der Dokumentenbestand neu indexiert werden.

Weiterführende Informationen:

Markus Klose