Lucene

Lucene ist eine Suchmaschine für Textdokumente. Lucene ist in Java implementiert, es gibt aber auch Varianten für andere Programmiersprachen. Kernpunkt der Arbeitsweise von Lucene ist der Index.


Dokumente indexieren

Dokumente werden mit einem IndexWriter in den Index aufgenommen. Dokumente sind strukturiert, sie enthalten mehrere benannte Teile (z.B. den Titel, den Textrumpf, ...). Die Teile eines Texts werden durch Instanzen der Klasse Field repräsentiert. Wenn ein Dokument in den Index aufgenommen wird, werden dessen Teile mit einem Analyzer in Wörter zerlegt. Es gibt spezielle Analyzer für spezielle natürliche Sprachen (Englisch, Deutsch), die berücksichtigen, dass manche häufige Wörter nicht in den Index aufgenommen werden sollen (z.B. Artikel). Sprachspezifische Analyzer führen identifizierte Wörter auf ihren Wortstamm zurück (z.B. das Wort "Wörter" auf den Wortstamm "Wort"). Es ist möglich, eine Liste von Stop Words anzugeben. Stop Words werden nicht in den Index aufgenommen. Einige Analyzer unterstützen auch Exclusions. Exclusions werden nicht auf ihren Wortstamm zurückgeführt (z.B. Eigennamen, Kunstwörter).

Analyzer analyzer = new StandardAnalyzer();
IndexWriter writer = new IndexWriter(<Verzeichnis des Index>, analyzer, false);
Document document = new Document();
Field field = new Field(<Name>, <Text>, true, true, true);
document.add(field);
writer.addDocument(document);
...
writer.close();

Der Index dient als Basis für die Textsuche.


Dokumente suchen

Nachdem Dokumente in einen Index aufgenommen wurden, können Suchanfragen anhand des Indexes beantwortet werden. Dazu wird ein IndexSearcher für den Index erstellt. Eine mit dem QueryParser erzeugte Query kann dann dem IndexSearcher übergeben werden und erzeugt Hits. Die Reihenfolge, in der Dokumente im Resultat vorkommen, bestimmt sich nach der Häufigkeit eines Suchbegriffs im Dokument (wenn der Suchbegriff öfter auftritt, wird das Dokument weiter vorne einsortiert) und der Anzahl der Dokumente, in der ein Suchbegriff auftritt (wenn mehrere Suchbegriffe verwendet werden, werden die Suchbegriffe höher gewichtet, die in weniger Dokumenten auftauchen).

Searcher searcher = new IndexSearcher(<Verzeichnis des Index>);
Analyzer analyzer = new StandardAnalyzer();
Query query = QueryParser.parse(<Anfrage>, <Name>, analyzer);
Hits hits = searcher.search(query);
//
for (int i = 0; i < hits.length; i++)
{
Document document = hits.doc(i);
...
}

Queries können aus folgenden Elementen mit "oder", "und" oder "und nicht" kombiniert werden:

• Wort (in einem Field),
• Anfang eines Worts,
• Wort mit Wildcards * und ?,
• Wortfolge,
• Anfang einer Wortfolge,
• ähnliches Wort (die Wortähnlichkeit wird nach Levenshtein gemessen: zwei Wörter sind umso unähnlicher, je mehr Buchstaben gelöscht, eingefügt oder geändert werden müssen, um aus dem einen Wort das andere Wort zu machen),
• Wort größer <X> und kleiner <Y>,
• Wörter am Anfang eines Dokumentteils,
• benachbarte Wörter.


Quelle

http://lucene.apache.org/