Wer für seine Anwendung Volltextsuche benötigt, sollte den Einsatz der Java-Bibliothek Apache Lucene oder der darauf basierende Webanwendung Apache Solr ernsthaft in Erwägung ziehen. Egal für welche Technik man sich von beiden entscheidet, letztlich werden die indizierten Daten in einem Lucene-Index abgelegt. Der Lucene-Index kann zwar im Speicher gehalten werden, aber bei großen Datenmengen und für die Fehlersuche sollte man den Index im Dateisystem ablegen.
Mit dem Programm Luke kann sich der Entwickler die abgelegten Daten des Lucene-Index anschauen. Auch wenn das Programm etwas altbacken ausssieht, bietet es wertvolle Hilfe, wenn Dinge mal nicht wie erwünscht funktionieren:
- Übersicht zu den wichtigsten Begriffen
- anzeigen von Dokumenten mit den zugehörigen Index-Werten
- ausführen von Suchen und anzeigen der Suchergebnisse
- bearbeiten und optimieren des Lucene-Indexes
Luke – leider nur für Lucene Version 4.0 verfügbar
Beim Besuch der Luke-Webseite https://code.google.com/p/luke/ erkennt man derzeit leider, dass die letzte Version von Juli 2012 und damit für die Lucene-Version 4.0 ist (aktuelle Lucene-Version: 4.4). Wenn man also die angebotene Version herunterlädt und mit
java -jar lukeall-4.0.0-ALPHA.jar
startet, lassen sich nur Lucene-Indices bis zur Version 4.0 analysieren.
In meinem Lucene-Beispiel Lucene: Volltextsuche leicht gemacht wird die Lucene-Version 4.1 eingesetzt. Das ist auch an den Dateinamen des Lucene-Indexes erkennbar:
bruno$ git clone git://github.com/me4bruno/blog-examples.git bruno$ cd blog-examples/example-lucene/ bruno$ mvn clean install bruno$ tree bruno$ tree . ├── AkwIndex │ ├── _0.fdt │ ├── _0.fdx │ ├── _0.fnm │ ├── _0.si │ ├── _0_Lucene41_0.doc │ ├── _0_Lucene41_0.pos │ ├── _0_Lucene41_0.tim │ ├── _0_Lucene41_0.tip │ ├── _0_nrm.cfe │ ├── _0_nrm.cfs │ ├── segments.gen │ └── segments_1 ├── README.md ├── pom.xml ├── src │ └── main │ ├── java │ │ └── de │ │ └── bruns │ │ └── example │ │ └── lucene │ │ ├── AkwCsvData.java │ │ ├── AkwCsvImporter.java │ │ ├── AkwIndexReader.java │ │ ├── AkwIndexWriter.java │ │ ├── AkwResultDocument.java │ │ ├── Constants.java │ │ └── Start.java │ └── resources │ ├── atomkraftwerke_deutschland.csv │ └── log4j.properties ├── target │ ├── classes │ │ ├── atomkraftwerke_deutschland.csv │ │ ├── de │ │ │ └── bruns │ │ │ └── example │ │ │ └── lucene │ │ │ ├── AkwCsvData.class │ │ │ ├── AkwCsvImporter.class │ │ │ ├── AkwIndexReader.class │ │ │ ├── AkwIndexWriter.class │ │ │ ├── AkwResultDocument.class │ │ │ ├── Constants.class │ │ │ └── Start.class │ │ └── log4j.properties │ ├── example-lucene.jar │ ├── maven-archiver │ │ └── pom.properties │ └── surefire └── tools └── lukeall-4.1.0.jar
Beim Öffnen des Indexes erhalten wir dann leider folgende Exception:
Exception in thread "main" java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene41' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.The current classpath supports the following names: [Lucene40, Lucene3x, Asserting, SimpleText, Appending] at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:104) at org.apache.lucene.codecs.Codec.forName(Codec.java:95) at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:299) at org.apache.lucene.index.SegmentInfos$1.doBody(SegmentInfos.java:347) at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:783) at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:630) at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:343) at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:628) at de.bruns.example.lucene.AkwIndexWriter.writeIndex(AkwIndexWriter.java:24) at de.bruns.example.lucene.Start.main(Start.java:31)
Luke – selber bauen
Das bringt uns also noch nicht richtig weiter. GitHub-Benutzer mingfai hat Luke zum Selberbauen in GitHub importiert. Wenn man einen Git-Client und Apache Ant installiert hat, kann man es einfach in der Konsole selber bauen. In den Dateien build.xml
und download-dependencies.sh
könnte man die Lucene-Version anpassen, wobei momentan die für uns passende Version 4.1 eingestellt ist. Also dann mal los:
git clone https://github.com/mingfai/luke cd luke/ ./download-dependencies.sh ant java -jar build/lukeall-4.1.0.jar
Viel Spaß beim Analysieren der Daten. Falls etwas nicht klappt, hilft vielleicht ‚Table Flipping‚: (╯°□°)╯︵ ┻━┻)