Lucene. Volltextsuche mit Java. Georg Schumann



Ähnliche Dokumente
Jakarta Lucene. Eine Java-Bibliothek zur Suchindex-Erstellung. Seminararbeit Tilman Schneider

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

kleines keyword brevier Keywords sind das Salz in der Suppe des Online Marketing Gordian Hense

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Grundbegriffe der Informatik

Artikel Schnittstelle über CSV

- Google als Suchmaschine richtig nutzen -

Übung Medienretrieval WS 07/08 Thomas Wilhelm, Medieninformatik, TU Chemnitz

Software Engineering Klassendiagramme Assoziationen

Barrierefreie Webseiten erstellen mit TYPO3

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

DIE SUCHFUNKTION VON WINDOWS 7

Sie werden sehen, dass Sie für uns nur noch den direkten PDF-Export benötigen. Warum?

Internet Kurs. Suchmaschinen

Erstellen einer digitalen Signatur für Adobe-Formulare

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

LinguLab GmbH. Bedienungsanleitung Allgemeine Definition

Kurzanleitung zur Bereitstellung von Sachverhalten und Lösungen zum Universitätsrepetitorium auf dem Server unirep.rewi.hu-berlin.

SEMINAR Modifikation für die Nutzung des Community Builders

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

12. Dokumente Speichern und Drucken

IAWWeb PDFManager. - Kurzanleitung -

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Kleines Handbuch zur Fotogalerie der Pixel AG

Durchführung der Datenübernahme nach Reisekosten 2011

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

SEA Search Engine Advertising. esc. mediagroup

teamsync Kurzanleitung

Es gibt einige Kardinalstellen, an denen sich auf der Festplatte Müll ansammelt: Um einen Großteil davon zu bereinigen.

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

Kapiteltests zum Leitprogramm Binäre Suchbäume

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

GEVITAS Farben-Reaktionstest

Bilder zum Upload verkleinern

Datensicherung. Beschreibung der Datensicherung

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Ihr Weg in die Suchmaschinen

Anzeige von eingescannten Rechnungen

Kommunikations-Management

Die Textvorlagen in Microsoft WORD und LibreOffice Writer

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

Serien- mit oder ohne Anhang

1 Mathematische Grundlagen

Kapitel 3 Frames Seite 1

Eine Einführung in die Installation und Nutzung von cygwin

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Erstellen und Bearbeiten von Inhalten (Assets)

PHPNuke Quick & Dirty

Primzahlen und RSA-Verschlüsselung

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

GITS Steckbriefe Tutorial

Berechnungen in Access Teil I

Anleitung über den Umgang mit Schildern

virtuos Leitfaden für die virtuelle Lehre

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Software- und Druckerzuweisung Selbstlernmaterialien

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

DRK Ortsverein Henstedt-Ulzburg e.v. DRK Möbelbörse. Benutzerhandbuch. Version 1.2

Access Verbrecherdatenbank Teil 3

Allgemeiner Leitfaden zum Einfügen suchmaschinenoptimierter Texte

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock

Grundlagen der Theoretischen Informatik, SoSe 2008

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Beschreibung des MAP-Tools

Gezielt über Folien hinweg springen

Datenbanken Kapitel 2

Summenbildung in Bauteiltabellen mit If Then Abfrage

Programmieren in Java

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Hilfe und Support. Statische Hilfe. Inhaltsverzeichnis der Hilfetexte. Reihe TextGrid-Tutorials

Einfügen von Bildern innerhalb eines Beitrages

Wie richten Sie Ihr Web Paket bei Netpage24 ein

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Abenteuer e-commerce Erfolgreich mit dem eigenen Onlineshop.

Ein Tool zum Konvertieren von Pegasus Mail Adressbüchern und Verteilerlisten in Novell Groupwise Adressbücher.

SEP 114. Design by Contract

4.1 Wie bediene ich das Webportal?

Leichte-Sprache-Bilder

Schulungsunterlagen zur Version 3.3

Handbuch Groupware - Mailserver

1. Einführung. 2. Archivierung alter Datensätze

SSI WHITE PAPER Design einer mobilen App in wenigen Stunden

Übung: Verwendung von Java-Threads

Lernprogramm. EDS Anpassung für Administratoren. support.ebsco.com

! " # $ " % & Nicki Wruck worldwidewruck

Arbeiten mit UMLed und Delphi

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Objektorientierte Programmierung

4 Aufzählungen und Listen erstellen

-Inhalte an cobra übergeben

OSD-Branchenprogramm. OSD-Version Was ist neu? EDV-Power für Holzverarbeiter

5.2 Neue Projekte erstellen

Outlook-Daten komplett sichern

Stammdatenanlage über den Einrichtungsassistenten

Transkript:

Lucene Volltextsuche mit Java Georg Schumann Fachhochschule Augsburg Baumgartnerstraße 16, 86161 Augsburg, Masterstudiengang Informatik E-Mail: gschu@fh-augsburg.de 5. Juli 2006 Kurzfassung: Überall in der digitalen Welt sehen wir uns einer gigantischen Menge an Daten gegenüber, sei es nun auf dem eigenen PC, am Firmenrechner oder im Internet. Da man aber zum einen Quantität nicht mit Qualität gleichsetzen kann und zum anderen auch nicht jede qualitativ hochwertige Information für uns relevant ist, benötigen wir schnelle, einfach zu bedienende, effiziente und am besten noch kostengünstige Suchmaschinen. Alle diese Anforderungen erfüllt Lucene, ein in Java implementiertes Framework, das die Erstellung einer Volltextsuchmaschine ermöglicht. Dieser Artikel gibt einen Einblick in die Grundlagen und Funktionsweise von Lucene. Dazu zählen die Indexierung von Daten und die Suche in dem erstellten Index. Diese zwei Kernthemen werden erklärt und an Hand eines Beispiels verdeutlicht. Abgerundet wird der Text durch eine Auflistung der Vor- & Nachteile und einen Ausblick auf geplante Erweiterungen von Lucene. Kategorien: Content Management Schlüsselwörter: Java, Volltextsuche, Lucene, Apache Software Foundation, Indexierung Einführung Bei der Fülle an vorhandenen digitalen Daten, sei es nun im privaten Bereich oder im Geschäftsleben, wird es zunehmend schwieriger den Überblick zu behalten. Zur Erleichterung dieses Problems tragen Suchmaschinen bei, die sich immer größerer Beliebtheit erfreuen. Mittels ihrer ist es möglich benötigte Informationen innerhalb von Sekunden zu finden. Den Komfort einer Suche wollen sich viele Leute leisten, Privatpersonen wie auch Firmen. Lucene, ein in Java implementiertes, Open-Source-Framework 1, bietet die Möglichkeit selbst eine Suchmaschine zu implementieren. Diese kann in hohem Maß personalisiert werden, indem beispielsweise der Suchraum begrenzt wird oder bestimmte Schlagwörter eine höhere Bedeutung bekommen als andere Wörter. Lucene stellt Klassen zur Implementierung einer Volltextsuche zur Verfügung. Definition Volltextsuche: Eine Volltextsuche ist das Auffinden von Texten in einer Vielzahl gleicher oder verschiedenartiger Dateien auf einem Computer, einem Server und/oder im Internet [4]. Die Realisierung der Volltextsuche erfolgt in zwei Hauptschritten: der Indexierung und der Suche. Bei Ersterem wird der Suchraum (zu durchsuchende Dateien 2 ) indexiert. Das Resultat entspricht in etwa einem Index in einem Buch, nur dass hier jedes Wort der Eingabedokumente enthalten ist (der Programmierer kann hier Einschränkungen machen). Die Suche erfolgt durch 1 Ein Framework ist eine Menge kooperierender Klassen, die ein wiederverwendbares Design für einen speziellen Anwendungsbereich vorgeben 2 Datei ist hier ein abstrakter Begriff für verschiedene Eingabeformate wie HTML/XML Seiten, PDF-Dateien, Word- Dokumente usw.

Eingabe von Schlagwörtern, nach denen im Index gesucht wird. Die Suche in einem Index ist äußerst schnell. Wie diese zwei Hauptschritte im Detail ablaufen wird im weiteren Verlauf erklärt und durch ein Codebeispiel verdeutlicht. Im Anschluss an die Suche erfolgt die Darstellung der Ergebnisse. Diese ist nur noch bedingt Lucene-spezifisch und wird nur kurz erwähnt. Historische Entwicklung Die Apache Software Foundation (ASF) formierte sich 1995. Ihr ursprüngliches Anliegen war die Implementierung des Apache HTTP-Server s. Mit steigender Popularität dieses Servers wurde auch die Foundation bekannter und startete weitere Projekte wie das Jakarta Projekt, das sich die Implementierung serverseitiger Java-Anwendungen zum Ziel gesetzt hat. Lucene ist, da es in Java geschrieben wurde, auch Teil des Jakarta Projekts. Es wurde 2001 unter seinem jetztigen Namen in die ASF aufgenommen [2]. Die erste Idee zu einer frei verfügbaren, plattformunabhängigen, mit Java realisierten Suchmaschine hatte der Begründer von Lucene ist Doug Cutting im Jahre 1997. Seit der offiziellen Aufnahme in die ASF erfreut sich Lucene großer Beliebtheit, nicht nur in der Open-Source-Gemeinde sondern auch bei Großfirmen wie FedEx und Hewlett-Packard. Nach diesem kurzen entwicklungsgeschichtlichen Ausschnitt gehen die nächsten Kapitel in medias res und beschreiben die Funktionsweise von Lucene. Ablauf einer Suche [1], [2], [6], [9] Um eine Suche mit Lucene zu implementieren, muss als erstes ein Suchraum definiert und aufbereitet werden. Dieser Schritt wird als Indexerstellung bezeichnet. Es wird ein Index ähnlich dem eines Buches erstellt. Dieser enthält alle Wörter die im Suchraum auftreten. Suchraum ist ein abstrakter Begriff, der die Gesamtheit aller Dokumente umfasst, die als Eingabedaten (Datenbasis) dienen. Meistens möchte man vor der Indexierung eine Normalisierung des Suchraums durchführen. Die Normalisierung beschleunigt die Suche auf dem Index durch Reduktion der enthaltenen Datenmenge. Dies geschieht mit verschiedenen Analyzern (Filtern) die im nachher noch näher erläutert werden. Ist der Index, erstellt kann der Nutzer eine Anfrage stellen. Diese Anfrage kann boolsche Terme, Wildcards und themenbezogene Terme enthalten, um nur einige Möglichkeiten zu nennen. Um die Integrität zwischen Index und Anfrage sicherzustellen werden auf die Anfrage die gleichen Filter zur Aufbereitung angewendet wie vorher zur Indexerstellung. Nach der Aufbereitung einer Anfrage wird mit dieser der Index durchsucht. Lucene bietet dem Programmierer etliche Möglichkeiten um die Ergebnisse (Hits) aufzusammeln und diese schon vor der Anzeige nach Relevanz zu sortieren, also bestimmten Ergebnisteilen eine höhere Bewertung zu geben. Danach erfolgt die Darstellung dieser Ergebnisse für den Nutzer. Damit ergibt sich folgendes Bild für den Ablauf einer Volltextsuche mit Lucene: Der gesamte Text aus dem Suchraum wird durch den IndexWriter 3 mittels eines Analyzer in für Lucene lesbare Dokumente verwandelt und diese in den Index aufgenommen. Die Anfrage (symbolisiert durch die Fragezeichen) wird vom QueryParser mittels desselben Analyzer in eine Lucene lesbare Query verwandelt und mit dieser im Index gesucht. Das Bild zeigt deutlich, das der gleiche Analyzer für Indexierung & Suche verwendet wird. Die 3 Javaklassen des Lucene Frameworks

Abbildung 1: Überblick über den Gesamtablauf Hits (Ergebnisse) werden dann dem Nutzer, der die Anfrage stellte, angezeigt. Im folgenden werden Indexierung und Suche detailierter erklärt. Indexierung [9] Die Indexierung oder Indexerstellung ist die Grundlage für alle späteren Suchvorgänge. Die Qualität des Index determiniert letztlich die Qualität, die bei der Suche erzielt werden kann. Darum sollte der Entwickler diesen essentiellen Schritt genaustens verstehen und sauber implementieren. Zur Vereinheitlichung werden alle Eingabedokumente in Lucene Dokumente umgewandelt. Diese werden später ausgelesen und deren Terme in den Index geschrieben. Da Lucene Dokumente ein zentraler Punkt bei der Indexerstellung sind, schauen wir deren Charakteristik und Erstellung genauer an. Lucene-Dokument (LD) Jedes Dateiformat kann in ein LD umgewandelt werden. Dazu muss sein Inhalt umstrukturiert werden. Diese Umstrukturierung ist hauptsächlich die Kondensierung der Metainformation (Strukturinformation) der umzuwandelnden Dateien. Das Resultat eines jeden solchen Parserschritts ist ein Dokument das für Lucene lesbar ist und ausschließlich Text aus der kongruenten Eingabedatei enthält. LDs wiederum bestehen aus Lucene-Feldern. Ein Dokument besteht aus mindestens einem Feld. Jedes Feld enthält einen spezifischen Wert [1], [2]. Der Begriff Feld ist, wie LD, abstrahierend. Er umschreibt einen speziellen Teil der Eingabedatei. Die Werte enthalten den Text aus der Eingabedatei, sind also Träger der eigentlichen Information. Man spricht von Feldname-Wert-Paaren. Die Verwendung von gut gewählten Feldern ist sehr empfohlen [1], [2], da dem Nutzer so eine spezifischere und schnellere Suche ermöglicht werden kann. Die folgenden Beispiele sollen das Verständnis der gerade erklärten Begriffe, LD und Lucene Feld, vereinfachen. Beispiele für mögliche Eingabedateien: HTML, XML Entitäten einer Datenbank

Java Klassen Textdokumente wie Word, PDF (Auch Exceltabellen sind möglich) Beispiele für mögliche Felder: Dateiname, Überschrift, Java-Methode, Paragraph, HTML / XML Tag mit Inhalt. Das Anlegen von LDs, mit ihren Feldern, ist nur ein standardisierender Zwischenschritt. Mittels eines Objekts der Klasse IndexWriter wird nun der Index, auf Basis der LDs, erstellt. Der Index enthält Terme (oder Token). Sätze in Feldern werden durch den Tokenizer in diese kleinsten Indexeinheiten zerlegt. Aus diesen Token, ist der Index aufgebaut. Manchmal möchte man nicht den gesamten Text der Eingabedateien in ein LD, und damit später in den Index, übernehmen. Um hier eine Trennung nach wichtig und unwichtig zu erreichen, dienen Analyzer (Filter). Filter haben jedoch nicht nur einen trennenden Effekt (parsing effect), sondern erfüllen auch noch eine Normalisierung. Diese Normalisierung ist sehr wichtig, um eine leistungsfähige Suche zu gewährleisten. Ein besonders erwähnenswerter Normalisierungsschritt ist die Reduzierung von Wörtern auf ihren Wortstamm (Beispiel: rannte -> renn). Diese Reduzierung ist eine sehr anspruchsvolle Aufgabe, die für Deutsch und Englisch pasabel gelöst ist [2], [12]. Hinter dem Begriff Wortstammreduktion (Stemming) verbirgt sich die Rückführung eines Wortes auf seinen Wortstamm. So ist beispielweise trink der Wortstamm für tränken, Getränk, Umtrunk, trinkst, tranken, Umtrunk, trinken, ertrinken. Diese Reduktion hilft dabei den Index zu verkleinern und somit die Indexierzeit, sowie auch die Suchzeit auf diesem Index zu verringern. Es gibt bereits für einige Sprachen, darunter auch deutsch 4, generische Wortstammreduktionsalgorithmen, jedoch ist dieses Problem nicht trivial lösbar und somit sind selbst die vorhandenen Stemmer noch ausbaufähig refwortstammreduktion. Eventuell werden auch Blacklist-Filterungen durchgeführt. In Schwarzen Listen werden Wörter deklariert die nicht in den Index kommen, da sie häufig vorkommen und damit wenig Information tragen (Shannon Informationstheorem). Bei Blacklist-Filterungen ist allerdings zu bedenken, dass wichtige Phrasen verloren gehen können. Man denke nur an Shakespeare To be or not to be. Alle vorkommenden Wörter würden einer Blacklist-Filterung zum Opfer fallen und man würde dem Nutzer die Chance nehmen nach dieser Phrase zu suchen. Nun ein exemplarischer Code, der die Indexierung verdeutlichen soll. import (einige Lucene- /Javaklassen) public class Indexer { public static void index(file indexdir, File datadir) throws IOException { if (!datadir.exists()!datadir.isdirectory()) { throw new IOException(dataDir + " does not exist"); IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true); indexdirectory(writer, datadir); writer.close(); private static void indexdirectory(indexwriter writer, File dir) throws IOException { File[] files = dir.listfiles(); for (int i=0; i < files.length; i++) { File f = files[i]; if (f.isdirectory()) { 4 Stemming Filter für deutsche Sprache von Jörg Caumann

indexdirectory(writer, f); // recurse else if (f.getname().endswith(".txt")) { indexfile(writer, f); private static void indexfile(indexwriter writer, File f) throws IOException { Document doc = new Document(); doc.add(field.text("contents", new FileReader(f))); doc.add(field.keyword("filename", f.getcanonicalpath())); writer.adddocument(doc); public static void main(string[] args) throws Exception { if (args.length!= 2) { throw new Exception("Usage:... "); File indexdir = new File(args[0]); File datadir = new File(args[1]); index(indexdir, datadir); Die Klasse Indexer kann über die Kommandozeile mit 2 weiteren Parametern (Verzeichnis in dem der Index erstellt werden soll und zu indexierendes Verzeichnis) aufgerufen werden. Der Anfangspunkt des Programms ist dann die Mainmethode. Von ihr wird index() aufgerufen. Hier wird der zur Indexierung essentielle IndexWriter (siehe Abbildung 1), mit seinem Analyzer, initialisiert. Mittels der Methoden indexfile/indexdirectory werden alle txt-dateien in dem angegebenen Verzeichnis indexiert. Die angelegten LDs enthalten zwei Felder, content und filename. Zusammenfassung der Indexierung: Der mögliche Suchraum von Lucene kann beliebige Eingabedateien verschiedener Formate haben. Diese Dateien werden durch den Analyzer normalisiert und in relevant und nicht relevant getrennt. Die wichtigen normaliserten Daten werden dann, immer noch vom Analyzer, dokumenten- und felderweise in Token zerlegt und in den Index geschrieben. Dieser ist nun nutzbar. Um sich ein Bild des Indexinhalts zu machen, gibt es spezielle Werkzeuge die den Inhalt eines Index anzeigen können. Suche [1], [2], [9], [12] Ein auf die zuvor beschriebene Weise erstellter Index kann nun bereits zur Suche eingesetzt werden. Es gibt zwei Arten dem Nutzer Anfragen zu ermöglichen. Eine Möglichkeit ist es dem Nutzer Auswahlfelder zur Verfügung stellen. Dies ist für unerfahrene Nutzer ratsam, weil es einfach ist eine Anfrage durch Zusammenklicken zu erstellen. Jedoch kann diese Möglichkeit den Nutzer in seiner Anfragegestaltung sehr einschränken und bedeutet einen nicht zu vernachlässigenden Aufwand für den Programmierer. Mehr Flexibilität und Mächtigkeit bietet dem Nutzer die vollständig eigene Konstruktion von Anfragen. Dies ist jedoch nur für erfahrene Nutzer angebracht, die mit der speziellen Anfragesyntax von Lucene vertraut sind. Intern kann eine Luceneanfrage (Query) aus zwei elementaren Komponenten bestehen: Term = einzelnes Wort (eine Zeichenkette) ohne Leerzeichen (z.b. Baum, aber auch H5N1 ) Phrase = aneinander gereihte Terme die durch Leerzeichen getrennt sind und durch Anführungszeichen begrenzt (z.b. Mary hat ein kleines Lamm )

Diese elementaren Komponenten stellen die kleinste Einheit einer Abfrage dar. Intern werden aus den Abfragen des Nutzer s Lucene lesbare Anfragen (Queries) erstellt. Dazu werden die Terme der Abfrage von einem Analyzer normalisiert. Um Integrität zu gewährleisten sollte der gleiche Analyzer verwendet werden, der auch zum Erstellen des Index benutzt wurde. Es folgt ein Codebeispiel: import (einige Lucene- /Javaklassen) public class Searcher {\\ public static void search(file indexdir, String q) throws Exception{ Directory fsdir = FSDirectory.getDirectory(indexDir, false); IndexSearcher is = new IndexSearcher(fsDir); Query query = QueryParser.parse(q, "contents", new StandardAnalyzer()); Hits hits = is.search(query); System.out.println("Found " + hits.length() + " document(s):"); for (int i = 0; i < hits.length(); i++) { Document doc = hits.doc(i); System.out.println(doc.get("filename")); public static void main(string[] args) throws Exception { if (args.length!= 2) { throw new Exception("Usage:..."); File indexdir = new File(args[0]); String q = args[1]; if (!indexdir.exists()!indexdir.isdirectory()) { throw new Exception(indexDir + " is does not exist."); search(indexdir, q); Der Searcher wird mit zwei Parametern, Verzeichnis in dem der Index liegt und Suchanfrage, aufgerufen. In der search-methode wird nun der für die Suche essentielle IndexSearcher (siehe Abbildung 1) initialisiert. Dann wird noch ein Query-Objekt erstellt, welches den Suchbegriff q in Feld content sucht und q vorab mit dem gleichen Analyzer, mit dem vorhin der IndexWriter inizialisiert wurde, normalisert. Die Ergebnisse, Dokumente die den Suchbegriff q enthalten, werden als Hits gespeichert. Verknüpfung von Abfragekomponenten Komponenten lassen sich durch boolsche Operatoren verknüpfen. Bei deren Anwendung gibt es keine Besonderheiten zu beachten. Die Syntax entspricht der bekannten boolschen Operatoren Syntax 5. Ein Beispiel: Möchte man nach der Phrase content management und dem Term Sommersemester suchen würde die Anfrage folgendermassen aussehen: content management & Sommersemester Feldbezogene Anfragen In Kapitel (Lucene Dokument) wurde schon erwähnt, dass Felder in Lucene eine wichtige Rolle spielen und deren Auswahl gut durchdacht werden sollte. Durch Felder ist eine gute Strukturierung erzielbar, die leicht nachzuvollziehen ist. Der entscheidende Punkt ist jedoch die Option gezielt in bestimmten Feldern zu suchen. Möchte man beispielsweise nur Spielernamen des TSV 5 oder = ; und = &; nicht =!

1860 München erhalten lautet die Anfrage: verein: TSV 1860 München & Spielernamen. Verein stellt hierbei das Feld dar in dem gesucht werden soll. Der Programmierer muss sicherstellen, dass die Felder auch im Index vorhanden sind oder eine Fehlermeldung generiert wird. Desweiteren bemerken sie bitte, dass TSV 1860 München in Anführungszeichen gesetzt ist um die Terme so als Phrase zu kennzeichnen. Im Feld gesucht wird immer nur die erste Phrase (oder der erste Terme) nach dem Doppelpunkt. Wildcards Wildcards sind im Deutschen auch als Jokerzeichen bekannt. Diese können eingesetzt werden, wenn man z.b. nach allen Wörtern mit dem gleichen Präfix suchen möchte. Es gibt bei Lucene zwei Arten von Wildcards. Zum einen gibt es das Fragezeichen (?) welches genau ein beliebiges Zeichen beschreibt / Platzhalter für ein Zeichen ist. Zum anderen gibt es den Asteriks / Stern (*) der für beliebig viele Zeichen steht. Anzumerken ist auch noch, dass Wildcards bei Lucene nicht am Anfang eines Terms / einer Phrase stehen dürfen. Zur Illustration: Studien* würde alle Wörter im Suchraum finden die mit Studien anfangen. Darunter könnten Studiengang, Studienarbeit oder Studienauswertung fallen. Sonderzeichen Da es einige Zeichen gibt die eine spezielle Bedeutung in Lucene haben, man denke nur an gerade erwähnte Fragezeichen oder boolsche Operatoren, muss man diese kennzeichnen um dafür zu sorgen, dass sie auch in Termen der Anfrage vorkommen dürfen. Im Englischen wird häufig der Begriff Escaping verwendet, der den gleichen Sachverhalt beschreibt. Zum Kennzeichnen verwendet man den meistens den Backslash (\). Es folgt eine Auflistung der zu kennzeichnenden Sonderzeichen: *,,?, &, \,!, (, ),, ^ Relevanzeinstufung Eine sehr nützliche Eigenschaft von Lucene Abfragen ist die Relevanzeinstufung. Im Englischen wird der Term boosting factor verwendet. Damit kann man Termen der Abfrage eine höhere Gewichtung zuteilen um Ergebnisse, die diesen Term enthalten, weiter oben in der Trefferliste zu plazieren. Dies ist nützlich wenn die gesuchten Terme, für den Nutzer, unterschiedlich wichtig sind. Dem Programmierer ist erlaubt, während der Indexerstellung, bestimmte Felder oder Token höher zu bewerten, weil diese beispielsweise für die Firma von höherer Relevanz sind. Lucene bezieht bei der Relevanzeinstufung unter anderem diese zwei Gewichtungen mit ein 6. Ein Beispiel: Praktikum & Vorlesung ^10. Damit werden gefundene Vorlesungen zuerst genannt und die Praktika weiter hinten in der Trefferliste stehen. Abstand & Unschärfe Die letzten zwei Spezifikationsmöglichkeiten der Abfrage sind der Abstand und die Unschärfe. Abstand beschreibt wie weit zwei Terme / Phrasen im Suchraum voneinander entfernt sein dürfen um als Treffer gewertet zu werden. Dieser Operator wird auch NEAR Operator genannt 7 und wird vom Symbol ~ beschrieben der mit einem vorangehenden Leerzeichen an die Terme angehängt wird. Die unscharfe Suche ist eine Suche nach syntaktisch ähnlichen Wörtern. Beispiel: Raum~ liefert auch raus und Baum 6 genauere Informationen zur Berechnung der Gewichtung entnehmen sie bitte [1] oder [2] 7 engl. near = nah

Vor - / Nachteile von Lucene Lucene hat ein hohes Ansehen in der suchenden Gemeinde. Die Urteilsbildung sei dem Leser hier selbst überlassen. Wir werfen nun einen sachlichen Blick auf die harten Fakten die dieses Framework bietet. Vorteile Nachteile Java, deswegen plattform-unabhängig Mit umfangreichen Features breite Spanne von Einsatzszenarien (Web, Desktop, Firmen, Server, privat,...) Sehr flexibel Java Know-how nötig Programmieren vor Verwendung (keine Out-of-the-Box Lösung) Anpassungsaufwand Sehr gut dokumentiert Kein professioneller Support / Gewährleistung / Releasepläne Agile Entwicklergemeinde Unter ASF License vertrieben > wenig Restriktionen Indexieren in andere Systeme zb. DB Kostenlos & Open Source & Einsatzbereit Tabelle 1: Vor- und Nachteile von Lucene Abgaben bei Einnahmen die nur durch Lucene alleine entstehen Die tabellarisch dargestellten Fakten sprechen weitgehend für sich, dennoch sollen einige Punkte erklärt werden. Die konträren Argumente Sehr flexibel & Anpassungsaufwand beschreiben, dass Lucene dem Programmierer einerseits große Freiheiten bei der Gestaltung der Suche bietet, aber andererseits diese Freiheit Implementierungsaufwand bedeutet. Beispiel hierfür sei die praktisch unbegrenzte Erweiterbarkeit des Suchraums. Mit dem passenden Filter, der eine Eingabedatei liest und sie in ein Lucene Dokument verwandelt, kann jeder beliebige Dateityp in den Suchraum aufgenommen werden. Das Gegenargument zu diesem Punkt ist natürlich der hohe Anpassungsaufwand den der Programmierer hat um beispielsweise eigene Filter zu implementieren. Der Ausdruck Inkrementelles Reindexieren bedeutet, dass es möglich ist neue Dokumente in den schon vorhandenen Index einzufügen ohne komplett neu indexieren zu müssen und ohne dabei Performanzverluste hinnehmen zu müssen. Viele andere Suchmaschinen bieten diese Möglichkeit nicht. Ein weiterer Vorteil ist die Nutzung eines Invertierten Index. Das heisst es werden Worte oder Phrasen als erste Suchinstanz verwendet und nicht Dokumente. Diese Wörter/Phrasen verweisen auf die Dokumente die diese enthalten. Ausblick Die im Punkt Vorteile schon genannte sehr agile Entwicklergemeinde hat schon einige weitere Projekte in der Entwicklungsphase um Lucene weiter zu verbessern und so noch mehr Nutzer vom Einsatz dieses Produktes zu überzeugen. Unter http://lucene.apache.org/

java/docs/lucene-sandbox/ können sich Interessierte einen Überblick über den Fortschritt möglicher neuer Eigenschaften von Lucene machen. In den folgenden Kapiteln sind einige Überbegriffe, deren Umsetzung (algorithmische Lösung) die höchste Priorität hat, näher beschrieben. Wortstammreduktion Was sich hinter dem Begriff verbirgt wurde schon erläutert. Ebenso angesprochen wurde der Schwierigkeitsgrad dieser Aufgabe. Wegen diesem gibt es immer wider neue Algorithmen. Neuerungen find Sie in [12]. Phonetische Suche Die phonetische Suche beschäftigt sich mit ähnlich oder gar gleich klingenden (und damit auch ähnlich geschriebenen) Wörtern. Als Beispiele können hier die Nachnamen Mayer und Meier dienen. An Hand der Schreibweise sind die Namen deutlich unterscheidbar, nur in der Aussprache ist kein Unterschied erkennbar. Diese Filtereigenschaft ist auch als klingt wie 8 oder meinten Sie bekannt. Damit soll dem Nutzer bei Tippfehlern geholfen werden oder wenn er sich nicht ganz sicher ist wie der Begriff geschrieben wird. Assoziative Suche Synonymsuche, wie die assoziative Suche auch häufig genannt wird, beruht auf der Erkennung semantischer Gemeinsamkeiten. Ein Beispiel für eine Synonymsuche: Wenn man nach dem Wort Auto sucht möchte man durch eine assoziative Suche nicht nur alle Auto enthaltenden Dokumente erhalten, sondern auch solche die PKW, Kraftfahrzeug, Vierradwagen, Benziner, Diesel enthalten. Das ist eine sehr schwierige Aufgabe, weil jedem Begriff eine Bedeutung zugeordnet werden muss. Diese zusätzliche Information muss erstens irgendwie generiert werden, am besten automatisch, und zweitens auch in einer schnell durchsuchbaren Weise gespeichert werden. Einen Implementierungsansatz finden Sie in der Lucene Sandbox(WordNet). Regex Das Akronym Regex steht für reguläre Ausdrücke. Diese sind in der aktuellen Version von Lucene leider nur sehr rudimentär durch die beiden Wildcardsymbole repräsentiert. Eine vollständige Aufnahme der regulären Ausdrücke in die Lucene Abfragesyntax würde die Mächtigkeit dieser enorm erhöhen. Hierbei sei als Referenz nur die Mächtigkeit von Perl, Python oder AWK Skripten angegeben [5]. Ein Regex besteht meistens aus einer eckigen Klammer die mehrere Zeichen enthält(z.b. [feg]). Die Zeichen in der Klammer stellen keine feste Reihenfolge dar sondern sind als Menge zu verstehen. Ausserdem gibt es Quantoren die hinter diesen Klammern platziert werden um zu signalisieren wie häufig die Buchstaben der genannten Menge vorkommen sollen. Diese kurze Einführung sollte Sie nur kurz an die Syntax regulärer Ausdrücke errinnern. Für weitere Informationen verwenden Sie die einschlägige Literatur. Zusammenfassung Alle Argumente betrachtend kommt man zu dem Schluss dass Lucene im momentanen Entwicklungsstatus schon ein flexibles und sehr mächtiges Framework ist um Volltextsuchen zu realisieren. Die große Gemeinde von zufriedenen, auch kommerziellen, Nutzern unterstützt diese Aussage. Der am Anfang nötige Aufwand zur Implementierung ist vergleichsweise gering zu den Möglichkeiten die Lucene bietet und die dieses Dokument nur tangieren konnte. Auch die Tatsache, dass Lucene ein Produkt der ASF ist, lässt das Vertrauen in das Produkt weiter steigen. Mit diesen Rahmenbedingungen müssen Nutzer wohl nicht mit einer Einstellung des Projekts rechnen, sondern dürfen sich auf weitere, noch funktionalere, Releases freuen. 8 engl. sounds like

Literatur [1] Gospondnetic, Otis; Hatcher, Erik: Lucene in Action, Manning Verlag (2005) [2] Hardt, Manfred: Suchmaschinen entwickeln mit Apache Lucene, Software & Support Verlag (2004) [3] Artikel Lucene. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 13. Juni 2006, 10:10 UTC. URL: http://de.wikipedia.org/w/index.php?title=lucene&oldid=17804663 (Abgerufen: 5. Juli 2006, 13:23 UTC) [4] Artikel Volltextsuche. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 7. August 2005, 00:31 UTC. URL: http://de.wikipedia.org/w/index.php?title=volltextsuche&oldid=8256201 (Abgerufen: 5. Juli 2006, 13:26 UTC) [5] Friedl, Jeffrey: Reguläre Ausdrücke, O Reilly (2002) [6] Dollinger, Rainer: Optimierung von Web-Suchmaschinen am Beispiel von Apache Lucene, FH Oberösterreich (2005) [7] Ziegler, Cai: Suche nach Suche Apaches Lucene: eigene Suche und Indizierung ix (2006), Seite 120 [8] Naber, Daniel: Suchmaschinen entwickeln mit Apache Lucene, ix (2004), Seite 149 [9] Hatcher, Eric: Lucene Introduction, java.net(07/2004) [10] Unbekannter Author: The Lucene search engine: Powerful, flexible, and free (Easily add searching to your application with Lucene), http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-lucene-p2.html [11] White, Tom : Did You Mean: Lucene?, java.net(08/2005) [12] Lucene Homepage der ASF: http://lucene.apache.org/java/docs/

Erstellungserklärung: Hiermit erkläre ich, dass ich die vorgelegte Arbeit selbstständig verfasst, noch nicht anderweitig für Prüfungszwecke vorgelegt, keine anderen als die angegebenen Quellen oder Hilfsmittel benützt sowie wörtliche und sinngemäße Zitate als solche gekennzeichnet haben. Georg Schumann,