Suche mit Lucene. Dr. Christian Herta. Mai, 2009

Ähnliche Dokumente
Übersicht. Grundidee des Indexing Lucene Wichtige Methoden und Klassen Lucene Indizierungsbeispiele Lucene Suchbeispiele Lucene QueryParser Syntax

Suchen und Finden mit Lucene und Solr. Florian Hopf

Lucene eine Demo. Sebastian Marius Kirsch 9. Februar 2006

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

Search Evolution von Lucene zu Solr und ElasticSearch. Florian

Search Evolution von Lucene zu Solr und ElasticSearch

Datenbanken und Informationssysteme

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

2.4 Effiziente Datenstrukturen

Information Retrieval, Vektorraummodell

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Software Entwicklung 1

Suchmaschinen mit Lucene und SEMS

Information Retrieval,

Praktikum Information Retrieval Wochen 12: Suchmaschine

Rückblick. Aufteilung in Dokumente anwendungsabhängig. Tokenisierung und Normalisierung sprachabhängig

Java für Computerlinguisten

Objektorientierte Datenbanken

1 Klassen und Objekte

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Algorithmische Anwendungen WS 05/06 Document Ranking

Rückblick. Aufteilung in Dokumente anwendungsabhängig. Tokenisierung und Normalisierung sprachabhängig

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

Nachteile Boolesches Retrieval

Website-Suche mit OpenText Web Site Management. Frank Steffen - Senior Product Manager

Übersicht. Volltextindex Boolesches Retrieval Termoperationen Indexieren mit Apache Lucene

Volltextsuche mit Lucene & Lupy

Einführung Aufbau des Analyzer Analyse deutscher Texte. Analyse mit Lucene. Dr. Christian Herta. Mai, / 35

Federated Search: Integration von FAST DataSearch und Lucene

Einführung in Apache Solr

Implementieren von Klassen

PyLucene. Installation, Verwendung, Probleme, Lösungen. DZUG -Tagung Stefan Schwarzer, SSchwarzer.com

13. Bäume: effektives Suchen und Sortieren

Lucene in a Nutshell. Wie erstelle ich eine Suchanwendung mit Hilfe von Lucene? Bonsai-Tagung vom Conni Poppe

13. Bäume: effektives Suchen und Sortieren

Hibernate Search. Unterstützung laufender Java Projekte. Perfect Match Rent-a-team Coaching on the project Inhouse Outsourcing

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

LT11- Apache Lucene und Solr - Google im Eigenbau 03. August 2012 P. Schmidt

Einführung in die Computerlinguistik Information Retrieval: tf.idf

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Der Datentyp String. Stringvariable und -vergleiche

Objektorientierung III

SPRACHTECHNOLOGIE IN SUCHMASCHINEN IR-GRUNDLAGEN

SUCHMASCHINEN XAPIAN. Michael Strzempek FH Wiesbaden, 5. Juni 2008

Einstieg in die Informatik mit Java

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

HS Information Retrieval

Klassen als Datenstrukturen

Einführung in die Programmierung für NF MI. Übung 07

1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.

Einstieg in die Informatik mit Java

Java Referenzdatentypen genauer betrachtet

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Vererbung und Polymorphie

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

1 Abstrakte Klassen, finale Klassen und Interfaces

Information-Retrieval: Vektorraum-Modell

Algorithmen und Datenstrukturen 03

Programmieren in Java

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse

12 Abstrakte Klassen, finale Klassen und Interfaces

Vorkurs Informatik WiSe 16/17

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Exposé zur Studienarbeit. 04. August 2010

Kapitel 3: Variablen

Schwerpunkte. 8. Ausdrücke, Operatoren (einfache Typen) Beispiel: Schaltjahr Test. Einführendes Beispiel: Grundprobleme

Einstieg in die Informatik mit Java

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Vererbung, Polymorphie

3. Exkurs in weitere Arten der Programmierung

Einstieg in die Informatik mit Java

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Klausur zu Mathematische Grundlagen BachelorStudiengänge der Informatik

13 Abstrakte Datentypen

Johannes Unterstein - TINF16 - Java - Sommersemester 2017 JAVA. Weiterführende Spracheigenschaften

Repetitorium Informatik (Java)

2.5 Primitive Datentypen

Zeichenketten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java. 16.

Einstieg in die Informatik mit Java

Datentypen. strukturierte. elementare. skalare reelle statische dynamische int. list. real float. set. record. inhomogen. homogen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Arrays. Einleitung. Deklarieren einer Array Variablen

Beispiel: Start. Stop

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Ausnahmen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 27.6.

Tag 4 Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Transkript:

Mai, 2009

Lernziele - Inhalt Prozess der Suche Klassen der Suche Query-Objekte und Query-Syntax Scoring mit Lucene

Outline

Übersicht: Wichtige Klassen für die Suche IndexSearcher: Zentrale Klasse für den Zugang zum Index für die Suche Query: Klasse zur internen Repräsentation einer Anfrage; Subklassen repräsentieren dabei verschiedene Query-Typen QueryParser: Zum Überführen eines Suchstrings (Nutzereingabe) in ein Query-Objekt TopDocs: Container für den Zugri der Treer einer Suchanfrage ScoreDocs: Zugri zu den einzelnen Treern, die in den TopDocs-Instanzen gehalten werden

IndexSearcher Zentrale Klasse für den Index zur Suche Index wird über search-methode des IndexSearcher angefragt Önen des IndexSearchers ist eine aufwändige Operation, da interne Datenstrukturen vom Index initialisiert werden müssen -> Wiederverwenden!

Initialisierung des IndexSearcher Angabe des Verzeichnisses in dem den Index liegt über: Pfadangabe "/path/to/index"; benutzt dann intern FSDirectory über java.io.file Directory-Instanz über IndexReader

search-methoden des IndexSearcher Hinweis Zugri auf die Treer mittels TopDocs TopDoc search(query q, int n): n Anzahl der besten Treer, die zurückgeliefert werden TopDoc search(query q, Filter filter, int n): Filtern der Resultate mittels lter TopDoc search(query q, Filter filter, int n, Sort sort): Customisierte Sortierung mittels sort Zugri auf die Treer mittels HitCollector für angepasste Logik (zur Anzeige der Dokumente) void search(query q, HitCollector hits) void search(query q, Filter filter, HitCollector hits) Filter und HitCollector werden in späteren Vorlesungen behandelt

Aktualität Index-Aktualität Die Aktualität des durchsuchten Index bezieht sich auf den Index, der zur Zeit der Instanziierung des IndexSearcher vorhanden war. Neuere Dokumente oder Löschungen sind bei der Suche nicht sichtbar, bzw. erst nach: Index-commit z.b. IndexWriter.commit() Instanziierung eines neuen IndexSearcher

Zugri auf die Treer: TopDocs search(q,n) Methoden liefern TopDocs-Objekt zurück siehe über TopDocs kann auf die Suchergebnisse zugegrien werden Resultate sind (in der Regel) absteigend sortiert (Ranking) nach Relevanzkriterium (Cos-Similarity) (oder Sortierung - spätere Vorlesung)

TopDocs-Methoden totalhits: Rückgabewert ist Anzahl der Dokumente der Treer scoredocs: Rückgabewert ist Array of ScoreDoc-Instanzen zum Zugri auf die Resultate getmaxscore(): Rückgabewert ist höchster Score-Wert aller Treern. Der höchste Score muss nicht in den Top n-dokumenten vorhanden sein (Sorting-Kriterium)

Einzelne Treer: ScoreDoc ScoreDoc dient für den Zugri auf die einzelnen Treer ScoreDoc besteht aus einer Dokument-ID int doc und einem Score-Wert float score mittels IndexSearcher.document(doc) kann auf die gespeicherten Felder zugegrien werden

Paging Begrisklärung unter Paging versteht man das Blättern in den Suchergebnissen verschiedene Möglichkeiten zur Umsetzung: Genügend Resultate per search(..) holen und Instanzen von ScoreDocs und IndexSearcher oen halten (nicht stateless) Neue Anfrage falls der Nutzer blättert (stateless) bevorzugte Methode in Web-Anwendung (IO-)Caching macht wiederholte Anfragen schneller Suchanfrage z.b. in Link-URL oder hidden HTML-Feld halten

Outline

Query-Objekte zur internen Repräsentation der Query search-methoden des IndexSearcher nehmen ein siehe Query-Objekt entgegen Query-Objekte können verschiedenartig erzeugt werden: Direkte Instanzierung von Query-Objekten, Subklassen von Query, wie TermQuery, RangeQuery etc. mittels QueryParser XML Query-Parser Package (Lucene Sandbox) Die verschiedenen Query-Objekten können mittels boolescher Ausdrücke zu einem neuen Query-Objekt kombiniert werden

Übersicht: Wichtigste Subklassen von Query TermQuery RangeQuery PrefixQuery PhraseQuery WildcardQuery FuzzyQuery MatchAllDocsQuery BooleanQuery

TermQuery Erzeugung mittels: Term t = new Term("contents","java"); Query q = new TermQuery(t); keine Analyse (Stemming, Lowercasing, Normierung etc.) geeignet für Felder mit Field.Index.NOT_ANALYSED, d.h. z.b. zum Filtern, Dokumenten-IDs wie URIs etc.

RangeQuery Range über lexikographische Ordnung vom Start-Term bis zum End-Term (inklusiv oder exklusiv mittels zweier Konstruktor-Parameter) (intern) verschiedene Möglichkeiten: expandiert zur OR-Query (Standard); Nachteile: langsam falls zu vielen Terme expandiert unintuitives Ranking wegen idf über setconstantscorerewrite(true) wird ein internes bit set verwendet; Konstanter Score gleich dem Query-Boost beste Performance mittels TrieRangeQuery in Lucenes Sandbox Hinweis meist will man Range-Filtern (in späteren Vorlesung)

PrefixQuery Match aller Dokumenten, die mit einem Präx beginnen Beispiel: Term t = new Term("category","/science/") PrefixQuery q = new PrefixQuery(term) Query-Match z.b. bei category: "/sciene/physics" ezienter konstanter Score zum Ranken mittels setconstantscorerewrite(true), wie bei RangeQuery

PhraseQuery Phrasen-Suche über Positionslisten, d.h. nur für Felder ohne omittf(true)(siehe Vorlesung: Indizierung) Stopworte können nicht genutzt werden! über slop distance (default: 0) kann eine near query durchgeführt werden; move Reihenfolge der Terme auch über slop distance, z.b. von "A B" zu "B A" entspricht slop distance: 2 auch multiple term phrases(vorlesung: Suche); slop distance bezieht sich auf die totale Anzahl der moves Scoring berücksichtigt invers die Anzahl der moves 1 distance + 1 (1)

WildcardQuery Wildcard-Operatoren "*": match von keinem oder mehreren beliebigen Charaktern "?": match von einem Charakter setconstantscorerewrite(true) automatisches lowercasing als Standard-Verhalten Achtung Performance (vgl. Indexstruktur)

FuzzyQuery mittels Levenshtein Abstand (Edit-Distance) z.b. Abstand ist 1 für "Haus" und "aus" Angabe eines threshold t, der die Länge der Strings berücksichtigt: t = 1 distance min (textlen, targetlen) (2) Achtung Performance (vgl. Indexstruktur)

MatchAllDocsQuery match von jedem Dokument konstanter Score 1

Kombination von Query-Objekten Zusammenschalten verschiedenen Query-Objekte mittels Boolescher Ausdrücke (AND, OR, NOT) über Klasse BooleanQuery und Methode public void add(query q, BooleanClause.Occur occur) occur kann die Werte BooleanClause.Occur.MUST, BooleanClause.Occur.SHOULD, BooleanClause.Occur.MUST_NOT annehmen Gruppieren und Verschachtelungen möglich, da auch andere BooleanQuery-Instanzen hinzugefügt werden können TooManyClausesException falls zu viele Ausdrücke hinzugefügt werden (default: 1024); dies kann auch intern geschehen (vgl. RangeQuery) mit setmaxclausecount(int) kann der Wert erhöht werden; Achtung: Performance

Outline

QueryParser Klasse zum Parsen der Nutzeranfragen, z.b. Suchfeld in Web-Anwendung Query parser = new QueryParser(String field, Analyser analyser) Benötigt einen Analyser im Konstruktor. Dieser muss kompatibel zum Analyser der Indizierung sein! Der String field ist Default-Field für die Suche: Falls kein explizites Feld für einen Ausdruck angegeben wird, wird in diesem gesucht.

parse-methode Methode des QueryParser: public Query parse(string query) throws ParseException String query ist in der Regel die Nutzereingabe (Suchstring) Methode konvertiert query-string in Query-Objekt query-string muss der Lucene Query-Syntax entsprechen, falls nicht ParseException, die beschreibt warum das Parsing nicht geklappt hat

Settings für QueryParser Default-Suchoperator (Standard: OR) Codierung von Datum-Angaben (locale) Phrase-Slope Minimum Ähnlichkeit und Präx-Länge für Fuzzy-Queries Granularität des Datums Lowercase of Wildcard-Queries: ja oder nein etc.

Query-Syntax Die verschiedenen Query-Typen werden durch verschiedene spezielle Charakter ausgedrückt to escape special character: Backslash \ Beispiel für einen Query-String: +pubdate:[20060301 TO 20081231] Java AND (Apache OR Jakarta) Query.toString()-Methode liefert Einblick, wie die Query aussieht

Kombination von Klauseln Default-Operator: OR parser.setoperator(queryparser.and_operator) a AND b oder +a +b a OR b oder a b a AND NOT b oder +a -b

Query-Syntax (1) Gruppieren mittels Klammern: C++) Perl AND (JAVA OR Feld auswählen: author:(goethe OR Schiller) PrefixQuery: Java* default lowercasing PhraseQuery mittels Anführungszeichen: program" "java Stopworte! * ergibt keine Wildcardquery slope factor mittels: ~an abschlieÿende Anführungszeichen hängen

Query-Syntax (2) WildcardQuery: Jav?pr*g keine Wildcard am Anfang erlaubt default lowercasing FuzzyQuery: JAVA Boosting mittels Carat: junit 3.0 testing

RangeQuery inklusive [A TO F] exklusive {1041 TO 2010} bei Datum [1/1/04 TO 31/12/09] parser.setdateresolution auf gleiche Granularität wie beim Indexing einstellen mittels setlocale auf lokale Interpretation einstellen (Internationalisierung mittels I18N), z.b. mittels HttpServletRequest

Query Parsing API mächtiger als QueryParser Kombination von Parsing mit expliziten Query-Objekten möglich über BooleanQuery eigene Subklassen von QueryParser zur Anpassung eigener Query-Parser z.b. über ANTLR oder JFlex

Outline

Scoring mit Lucene Prinzip: erst mittels (erweiterten) Boolean-Modell die Dokumenten-Menge erhalten, die dem Boolean-Ausdruck entsprechen anschlieÿend Scoring mittels Vektorspace-Modell Ranking durch Sortierung nach Scores Wie kann das Vektor-Space Modell bei einer Suche über mehrere Felder erweitert werden?

Recap: Vektor-Space Modell Score-Berechung: score = d q d q (3) d bzw. q Dokument- bzw. Frage-Vektor d bzw. q Längen-(Norm) des Dokuments bzw. der Frage Vektoren und Normen können unterschiedlich deniert werden. Hier wird meist mit dem tf-idf gearbeitet. Der idf dient dabei als Wichtung der Terme. Zusätzlich sind weitere explizite Wichtungsfaktoren (Boost) b sowohl im Dokument als auch in der Anrage denkbar.

Recap: tf-idf Term-Frequenz (tf) bei Lucenes DefaultSimilarity: tf d,t = f t : für das Dokument d und den Term t f t : (rohe) Termfrequenz, d.h die Anzahl des Vorkommen des Terms t im Dokument d Inverse Document Frequency (idf) mittels DefaultSimilarity: idf t = 1 + ln(n/df t ) Gesamtzahl der Dokumente: N Dokumentenfrequenz: df t tf idf ist Multiplikation von tf mit idf

Erweiterung des Vektor-Space Modells auf Felder Pro Feld ein Vektor-Raum und Addition der einzelnen Scores: ( ) score d,q = f score f,q f = f b f f q f f q f (4) f steht für die Felder der Dokumente q f ist der Anteil der Query der sich auf Feld f bezieht b f : Feld-Boost, um die Bedeutung der unterschiedlichen Felder anwendungsspezisch zu wichten Ein Vektorraum für Feld-Term Paare Eine Dimension wird durch ein Feld-Term Paar bestimmt, z.b. sind content.haus und abstract.haus zwei unterschiedliche Terme In die Dokumentennorm d gehen somit auch Felder ein, die nicht abgefragt werden.

Implementierung des Scorings In den Subklassen der abstakten Similarity-Klasse Subklasse DefaultSimilarity wird verwendet, falls nicht anders deniert

Scoring bei Lucene mittels DefaultSimilarity score d,q = q 1 c q,d f.t q (tf f.t,d idf 2 f.t bq f.t n f.t) (5) f.t steht für den Term bezüglich des Feldes f bq f.t: Boost-Faktor des Terms f.t der Query, um diesen in f score f,q f der Anfrage zu wichten. n f.t = bi f.t/ f : Feld-Normalisierung und Boost-Faktor des Terms f.t des Feldes (inkl. Dokument-Boost); f = n f mit Anzahl der types (unterschiedlichen Terme) des Feldes n f c q,d: Koordination-Faktor; je gröÿer, desto mehr Terme der Query in den Feldern vorkommen

Lucene Scoring und Vektor-Space Modell Lucene Scoring entspricht im Wesentlichen dem pro 'Feld ein Vektorraum-Modell', wie leicht gezeigt werden kann: score d,q = q 1 c q,d c q,d q f.t q (tf f.t,d idf 2 f.t bq f.t n f.t) = (6) ((tf f.t f.t,didf f.tbi f.t)(tf f.t,qidf f.tbq f.t)) f Hier gibt es keine feldgenaue Fragenormierung q f. Dies wird aber einfach durch eine andere Wahl von bi f.t ausgeglichen. q 1 dient nur dazu Scores verschiedener Anfragen vergleichen zu können, und hat keine Auswirkungen auf das Ranking. c q,d als zusätzlicher Boost f (7)

idf für Phrasen...

Explanation IndexSearcher liefert über explain(query, docid)-methode ein Explanation-Objekt mittels Explanation-Objekt können die Details bezüglich des Scorings abgefragt werden (wie tf, idf, boost-faktoren, Query-Norm etc.) mittels.tostring() kann man dies in einem formatiertem String überführen und anzeigen lassen; oder.tohtml()