Apache Lucene/Solr Indexe OHNE Re-Indexierung auf die neuste Version bringen
Mit jeder neuen Version von Apache Solr gibt es neue tolle Features und Verbesserungen, von denen man gerne profitieren möchte. Oft bedeutet dies, dass man den Index komplett neu aufbauen (re-indexieren) muss. Dieses bei jedem neuen Solr Release durchzuführen ist natürlich nicht praktikabel. So treffen wir immer wieder auf Kunden, die ältere Indexe haben, aber gerne die neusten Funktionalitäten nutzen möchten. Apache Lucene bietet hier eine einfache Möglichkeit die Version des Indexes anzuheben und das möchte ich in diesem Blogbeitrag kurz beschreiben.
Die Möglichkeit des Index Upgrades, die Lucene mitbringt, ist technisch gesehen relativ trivial. Es wird nur der Index im neuen Format auf die Festplatte geschrieben. Es handelt sich also mehr oder minder um ein Merge bzw. Optimize des bestehenden Indexes. So kommt man ohne die Daten neu zu indexieren zu einem aktuellen Indexformat. Der Optimize kann jedoch in manchen Konstellationen länger dauern, als eine Neuindexierung. Daher lohnt sich dieses Verfahren vor allem dann, wenn die Anbindung an die Quelldaten langsam ist oder die Quelldaten nicht mehr vorhanden sind.
Beim Upgrade mittels Lucene wird beim Schreiben des Indexes die aktuelle Lucene Version genutzt. Da Lucene mindestens eine (Haupt)Version abwärtskompatibel ist können ältere Indexformate gelesen werden und somit Versions-Upgrades durchgeführt werden. Mit dem zurzeit aktuellen Lucene (5.3.0) können alle Indexe der Version 4.0.0 bis 5.3.0 gelesen werden. Dass Lucene nur eine ältere Index-Version unterstützt bedeutet aber auch, dass man nicht so einfach einen Lucene 3.6 Index auf die neueste Version migrieren kann. Man benötigt hier mehrere Schritte. Im ersten Schritt muss man den Index auf eine 4.x Version anheben, um diesen anschließend nach 5.3.0 migrieren zu können. Es gibt eine weitere Einschränkung. Dieses Upgrade Feature wurde mit der Lucene Version 3.2 eingeführt. Somit kann man mit dem Upgrade nur Lucene Indexe ab der Version 2.0 upgraden.
Aber auch ältere Lucene Indexe lassen sich mit einigen Kniffen auf ähnliche Weise upgraden. In einem meiner aktuellen Projekte beschäftige ich mich mit „Lucene Archäologie“, d.h. mit Uralt-Indexen (Version 1.3). Um solche Indexe mit einem aktuellen Solr durchsuchbar zu machen nutze ich den oben beschriebenen Prozess. Nur den ersten Schritt (Version 1.3 -> 2.9) mache ich ohne den IndexUpgrader. Mit der Lucene Version 2.9 öffne ich den entsprechenden Index und führe einen Optimize durch. Im Anschluss nutze ich den IndexUpgrader 3-mal um von der Lucene 2.9 Version auf die Lucene 5.3.0 Version zu kommen.
Apache Lucene IndexUpgrader
Der IndexUpgrader ist eine relativ kleine Klasse im Lucene Paket, die sich sowohl über Java direkt, als auch über die Kommandozeile nutzen lässt. Es folgt ein Beispiel, für einen Kommandozeilen-Aufruf. Dies geht leichter von der Hand, man muss nichts programmieren und führt zum gewünschten Erfolg.
java -cp lucene-core.jar org.apache.lucene.index.IndexUpgrade c:/indexDir
Nachdem der Upgrade Prozess fertig ist, wurde der Index im angegebenen Verzeichnis neu geschrieben; der originale Index ist gelöscht. Man sollte also darauf achten, dass man den Upgrade nie auf den Originaldaten ausführt, damit man im Falle eines Fehlers keinen Datenverlust hat.
Mit einem kleinen Batch Programm lässt sich so auch ein Sprung über mehrere Versionen durchführen.
Fazit
Mit dem IndexUpgrader lässt sich problemlos die Lucene Version aktualisieren. Damit ist man aber in der Regel noch nicht am Ziel, die Apache Solr Konfiguration muss ebenfalls migriert werden. Hier gibt es jedoch keine Tools, die das automatisch erledigen.
Des Weiteren gelten folgende Einschränkungen:
- Möchte man mehr als eine Hauptversion aktualisieren, z.B. von Lucene 3 zu Lucene 5 muss man dies in mehreren Schritten machen.
- Den IndexUpgrader gibt es erst seit der Lucene Version 3.2, wodurch erst Lucene Versionen 2.x unterstützt werden. Hat man ältere Indexe muss man einen eigenen Weg finden.
Aber der IndexUpgrader ist sehr hilfreich, wenn Quelldaten nicht mehr existieren oder die Indexierung zu lang dauert.