Andreas Bruns

Softwareentwicklung für Oldenburg und Bremen

Luke – ein Blick in den Lucene-Index

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: Übersicht

Luke: Übersicht

Luke: Dokument

Luke: Dokument

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‚: (╯°□°)╯︵ ┻━┻)

Kommentare sind geschlossen.