Blog der SHI GmbH

Solr ist Schemaless

Beim Vergleich von Solr mit Elasticsearch wird fast immer darauf hingewiesen, dass Elasticsearch schemaless ist. „Schemaless“ bedeutet, dass man direkt, ohne eine vorhergehende Konfiguration, mit der Indexierung loslegen kann und dass das Framework das Mapping von Daten zum Datentyp übernimmt. Bei Solr hingegen muss man immer erst die schema.xml-Datei anpassen, bevor man eigene Daten indexieren kann.
Seit Solr 4.4 gibt es nun auch bei Apache Solr das Feature schemaless. In diesem Blog werde ich kurz darauf eingehen, worum es sich dabei aus der Solr Sicht handelt und wie es grundsätzlich funktioniert.

Was ist Schemaless?

Jedem Solr Anwender ist die Datei schema.xml ein Begriff. Diese Datei ist eine der wichtigsten Konfigurationen, die das Design des Indexes beeinflusst. Hier wird nicht nur bestimmt, welche Felder existieren, sondern auch, wie sie analysiert werden bzw. als was für ein Datentyp die Felder gespeichert werden. Dies hat wiederum Auswirkungen auf die Durchsuchbarkeit und die Nutzbarkeit von Feldern. Numerische Felder können beispielsweise für Range-Suchen genutzt werden, alphanumerische Felder hingegen nicht.
Oftmals ist diese Datei jedoch ein nerviges Übel, denn man muss im Vorfeld jedes potenzielle Feld und dessen Typ definieren. Man kann hierbei zwar auf dynamische Felder zurückgreifen, dies minimiert den Aufwand jedoch nur etwas.
Mit Solr 4.4 wurde schemaless als Feature eingeführt. Dieses Feature bedeutet, dass Solr nun die Aufgabe übernimmt, anhand der Daten zu entscheiden, um welchen Feldtyp es sich handelt. Nach der Bestimmung des Typs wird das Feld im Index erzeugt. Damit fällt eine aufwändige Konfiguration der schema.xml-Datei weg und man kann sehr zügig mit Solr loslegen.
Dieses automatische Mapping wird nur auf den Feldern ausgeführt, die nicht explizit im Schema definiert worden sind. Trotz des Feature schemaless können weiterhin spezielle Felder definiert werden und diesen Feldern kann der Feldtyp manuell zugewiesen werden.

Schemaless Konfiguration

Dieses Feature kann direkt nach dem Download der Solr-Distribution genutzt werden. Hierfür wurde im example-Verzeichnis ein weiteres Solr Home-Beispiel „example-schemaless“ eingefügt. Um Solr schemaless zu starten, muss nun folgender Befehl ausgeführt werden:

	Java –Dsolr.solr.home=example-schemaless –jar start.jar

Wirft man einen Blick in die Konfigurationsdateien, erkennt man die Änderungen, die für dieses Feature notwendig sind.

Im Schema sind die Änderungen am einfachsten zu erkennen. Es sind nur noch die Felder „_version_“ und „id“ explizit definiert. Diese Felder sind zwingend erforderlich für die Solr Installation; alle anderen Felder werden dynamisch von Solr angelegt, sobald diese indexiert werden.

Technisch wird das Mapping und das Hinzufügen von Feldern über die bekannte UpdateProcessor-Chain realisiert. In der solrconfig.xml wurde eine neue Chain „add-unknown-fields-to-the-schema“ hinzugefügt und in alle UpdateHandler eingebunden. Das nachfolgende Code-Snippet zeigt den grundlegenden Aufbau dieser Chain:

<updaterequestprocessorchain name="add-unknown-fields-to-the-schema">
<processor class="solr.RemoveBlankFieldUpdateProcessorFactory"/>
<processor class="solr.ParseBooleanFieldUpdateProcessorFactory"/>
<processor class="solr.ParseLongFieldUpdateProcessorFactory"/>
    ...
<processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
      <str name="defaultFieldType">text_general</str>
      <lst name="typeMapping">
        <str name="valueClass">java.lang.Boolean</str>
        <str name="fieldType">booleans</str>
      </lst>
      <lst name="typeMapping">
        <str name="valueClass">java.util.Date</str>
        <str name="fieldType">tdates</str>
      </lst>
      ...
    </processor>
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
  </updaterequestprocessorchain>

Im ersten Schritt werden die Typen identifiziert (ParseBooleanFieldUpdateProcessorFactory oder ParseLongFieldUpdateProcessorFactory ) und im zweiten Schritt wird das Mapping von Datentyp zu Feldtyp durchgeführt. Die hier konfigurierten Typen sind in der schema.xml vorhanden und könnten bei Bedarf natürlich angepasst werden.
Grundlegend ist die Verarbeitungslogik so implementiert, dass das erste Dokument, welches indexiert wird, den Aufbau des Indexes bestimmt. Wird ein Feld, wie beispielsweise „Preis“ mit dem Wert „9,99“ indexiert, wird festgelegt, dass das Feld „Preis“ zukünftig vom Typ double ist. Diese Festlegung merkt sich Solr und wendet es auf alle weiteren Dokumente an.

Fazit

Mit dem Feature schemaless kann man problemlos mit Solr starten, um erste Erfahrungen zu sammeln oder Prototyping durchzuführen. Es kann auch dazu genutzt werden, dynamisch Felder in den Index aufzunehmen, die beispielsweise zum Beginn des Projektes noch nicht bekannt waren. Aus meiner Erfahrung heraus kann ich jedoch sagen, dass man teilweise nicht um eine Konfiguration des Schemas, vor Allem der Feldtypen und der Analyse, herumkommt, wenn man bestimmte Features, wie, z.B., Phonetische Suche umsetzen möchte. Aber dies ist ja ebenfalls bei Elasticsearch notwendig.

Es gibt jedoch einen großen Nachteil bzw. Stolperstein, der nicht unerwähnt bleiben sollte. Das automatische Mapping des Feldtypen kann auch fehlschlagen. Wird beispielsweise mit dem ersten Dokument ein Preis von 10 indexiert, wird als Feldtyp int festgelegt. Hat nun aber das zweite Dokument einen Preis von 9,99 führt es beim Indexieren zu einem Fehler.

Weiterführende Informationen

https://cwiki.apache.org/confluence/display/solr/Schemaless+Mode

Daniel Wrigley

Daniel Wrigley