02_Grundlagen Lucene Übung Medienretrieval WS 07/08 Thomas Wilhelm, Medieninformatik, TU Chemnitz
Was ist Lucene? (1) Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. It is a technology suitable for nearly any application that requires full-text search, especially cross-platform. [Website: Apache Lucene - Overview, Okt. 2007] Frei unter der Apache License, auch für kommerzielle Anwendungen Funktionsprinzip: invertierter Index
Was ist Lucene? (2) 3
Snippet 1: Index erstellen + Dokument indizieren IndexWriter iw = new IndexWriter(new File(Verzeichnis), Analyzer, true); Document doc = new Document(); doc.add(new Field(Feldname, Feldinhalt, Store.NO, Index.TOKENIZED)); iw.adddocument(doc); iw.close(); iw.optimize(); 4
IndexWriter Package: org.apache.lucene.index Der IndexWriter erzeugt einen neuen Index oder kann einen vorhandenen Index öffnen. IndexWriter iw = new IndexWriter( directory, analyzer, create ); Er kann Dokumente zum Index hinzufügen und daraus entfernen. iw.adddocument( document ); iw.deletedocument( term ); Er kann keinen Index lesen oder durchsuchen. 5
Analyzer (1) Package: org.apache.lucene.analyzer Analyzer normalisieren die Texte, die indiziert werden, um die Vielfalt von Wörtern zu verringern. Er besteht aus einem Tokenizer, der einen Datenstrom in einzelne Tokens meistens Wörter zerlegt, und mehreren Filtern, die die Tokens letztendlich normalisieren. Es gibt unter anderem folgende mitgelieferte Tokenizer: LetterTokenizer Wörter werden durch nicht-buchstaben getrennt WhitespaceTokenizer Wörter werden durch sogenannte Whitespaces getrennt StandardTokenizer ein Tokenizer mit einem gewissen grammatikalischen Verständnis (z.b. werden E-Mail-Adressen und URLs erkannt) 6
Analyzer (2) Package: org.apache.lucene.analyzer... und folgende Filter: StandardFilter normalisiert Tokens, die mit dem StandardTokenizer erzeugt wurden StopFilter entfernt Stop-Wörter LowerCaseFilter alle Zeichen werden in Kleinbuchstaben umgewandelt SnowballFilter extrahiert die Wortstämme der einzelnen Tokens für unterschiedliche Sprachen unter anderem: Englisch (Porter-Stemmer) Deutsch, Niederländisch Französisch, Spanisch, Italienisch Schwedisch, Norwegisch Russisch Türkisch... 7
Document Package: org.apache.lucene.document Ein Dokument ist die Repräsentation eines (wie auch immer existierenden) Dokumentes (oder auch eines einfachen Datensatzes) im Index. Es besteht aus mehreren Feldern. (siehe Field) 8
Field Package: org.apache.lucene.document Felder enthalten Daten, die gesucht werden können oder weitere Informationen zum Dokument (z.b. den Dateinamen usw.). Die Art und Weise, wie ein Feld gespeichert wird, wird über 2 weitere Attribute festgelegt: Index. NO das Feld wird nicht indiziert TOKENIZED das Feld wird indiziert und durch den Analyzer normalisiert UN_TOKENIZED das Feld wird ohne Analyzer indiziert Store. COMPRESS das Feld wird binär gespeichert (z.b. Bilder) NO der ursprüngliche Feldinhalt wird nicht gespeichert (kann also nicht wiedergegeben werden, sondern nur rekonstruiert) YES das Feld wird gespeichert (eignet sich aber nur für Texte) 9
Snippet 2: In einem Index suchen IndexSearcher is = new IndexSearcher( Verzeichnis ); Query query = new QueryParser( Standard- Feldname, Analyzer ).parse( Querystring ); Hits hits = is.search( query ); for ( int i = 0; i < hits.length(); i++ ) { System.out.println(hits.doc(i).get(Feldname) + Relevanz: + hits.score(i)); } 10
IndexSearcher Package: org.apache.lucene.search Ein IndexSearcher bietet einen read-only Zugriff auf einen existierenden Index. Damit können ausschließlich Suchen durchgeführt werden. Beispiele: IndexSearcher is = new IndexSearcher( fsdir ); IndexSearcher is = new IndexSearcher( "C:/index" ); 11
IndexReader Package: org.apache.lucene.index Der IndexReader kann nicht nur Daten aus einem Index lesen, sondern auch Dokumente löschen. Zu den Daten, die gelesen werden können gehören: einzelne Dokumente einzelne Felder, Listen von Feldern Listen von Termen Häufigkeiten von Termen und diverse Index-Parameter IndexReader ir = is.getindexreader(); IndexReader.open( "d:/index" ); 12
Query Package: org.apache.lucene.search Mit Hilfe von Query-Objekten können Anfragen an einen IndexSearcher formuliert werden. Query Implementierungen: TermQuery sucht einen bestimmten Term BooleanQuery enthält eine Liste von boolesch Verknüpften Queries uvm. Beispiel: BooleanQuery bq = new BooleanQuery(); bq.add( new TermQuery( new Term("field", "content")), Occur.MUST ); 13
QueryParser Package: org.apache.lucene.queryparser Diese Klasse wandelt eine textuelle Suchanfrage in ein Query-Objekt um. Dabei gilt eine spezielle Syntax: Terme sind einzelne Worte, wie z.b. test oder hallo Durch titel:test oder content:test kann das zu durchsuchende Feld (Field) eingeschränkt werden Wildcards:? und *, z.b. te?t, test* oder te*t Unscharfe Suche: roam~ oder roam~0.8 Gewichtung von Termen: apache^4 oder test^0.1 Boolsche Operatoren: jakarta AND apache oder jakarte OR apache uvm. siehe http://lucene.apache.org/java/docs/queryparsersyntax.html 14
Hits Package: org.apache.lucene.search Die Klasse Hits beinhaltet eine sortierte List von Dokumenten, die als Ergebnis einer Suchanfrage zurückgegeben werden. Die wichtigsten Methoden sind: length() - Anzahl von Einträgen (Dokumenten) doc( int ) - Dokument an der angegebenen Position score( int ) - Relevanzbewertung der angegebenen Position 15
Aufgaben 1. Workspace in Eclipse importieren 2. Klasse Indexer vervollständigen & Index erstellen 3. Klasse Searcher vervollständigen & suchen, z.b. (a) international stock (b) +international +stock (c) international AND stock 16
Luke Lucene Index Browser http://www.getopt.org/luke/ 17