Um Lucene benutzen zu können, müssen zunächst die entsprechenden Dateien runtergeladen werden, entweder über diese
Download-Seite, oder aber direkt über die offizielle
Lucene-FTP-Seite. Nachdem die Dateien entpackt wurden, müssen zu der
CLASSPATH-Variable die Dateien "lucene-1.2.jar" und, um
die Demos ausprobieren zu können, "lucene-demos-1.2.jar" hinzugefügt werden.
Wir wollen uns nun eine kleine Demoanwendung angucken, um zu sehen, wie Lucene in der Praxis funktionieren kann. Die benötigten Java-Quellen
können von der
Download-Seite heruntergeladen werden.
Nachdem die Quellen (IndexFiles.java und SearchFiles.java) auf übliche Weise kompiliert wurden, wird nun der Index erstellt.
Dazu wird IndexFiles ausgeführt und als Argument der Pfad übergeben, dessen Dateien indiziert werden sollen, z. B.
"{Lucene-Pfad}/src", um die Lucene-Quelldateien durchsuchen zu können (java IndexFiles {Lucene-Pfad}/src).
Nun wird der
Index erstellt. Danach wird SearchFiles ausgeführt (java SearchFiles) und man kann eine Suchanfrage eingeben.
Für diese Mini-Suchmaschine werden also lediglich die drei relativ kurzen Quellen "IndexFiles", "SearchFiles"
und "FileDocument" benötigt.
Für das Programmieren eigener Anwendungen, die Lucene nutzen, empfiehlt sich immer wieder ein Blick in die
javadoc-Dokumentationen der Lucene-Klassen.
Schauen wir uns zunächst einmal die Datei "IndexFiles.java" an,
mit Hilfe derer der Index erstellt wird.
import org.apache.lucene.analysis.de.GermanAnalyzer;
import org.apache.lucene.index.IndexWriter;
import java.io.*;
import java.util.*;
public
class IndexFiles
{
public static
void main(String[] args)
{
try
{
Date start = new Date();
IndexWriter writer = new IndexWriter(Const.INDEX_DIR, new GermanAnalyzer(), true);
indexDocs(writer, new File(args[0]));
writer.optimize();
writer.close();
}
catch (Exception e)
{
System.out.println(" caught a " + e.getClass() + "\n with message: " + e.getMessage());
}
}
public static void indexDocs(IndexWriter writer, File file)
throws Exception
{
if (file.isDirectory())
{
String[] files = file.list();
for (int i = 0; i < files.length; i++)
indexDocs(writer, new File(file, files[i]));
}
else
{
System.out.println("hinzugefuegt: " + file);
writer.addDocument(FileDocument.Document(file));
}
}
}
Zunächst wird eine Instanz von "IndexWriter" erstellt.
- Erstes Argument: Name des Verzeichnisses, in dem der Index erstellt wird.
-
Zweites Argument: der entsprechende "Analyzer": dieser ist dafür zuständig, den Text zu analysieren und entsprechende Operationen zu unternehmen, wie etwa
alles in Kleinschreibung umwandeln, oder unnütze Wörter entfernen, z. B. Artikel oder Konjunktionen. Da dieses sprachspezifisch ist, existieren verschiedene
Analyzer. In diesem Fall wurde der deutsche gewählt, offiziell existieren momentan welche für Englisch und Deutsch.
- Drittes Argument: gibt an, ob ein neuer Index erstellt (true), oder zu einem bestehenden weitere Dokumente hinzugefügt werden sollen.
Dann wird "indexDocs(...)" aufgerufen:
- "indexDocs(...)" (weiter unten) durchläuft rekursiv die Verzeichnisse und Dateien.
- wurde eine Datei gefunden, wird diese mittels "addDocument(...)" dem "IndexWriter" hinzugefügt.