Volltextsuche mit Lucene und Solr
-
Upload
thomas-koch -
Category
Documents
-
view
4.970 -
download
1
description
Transcript of Volltextsuche mit Lucene und Solr
Apache Lucene / SolrVolltextsuche mit Open Source Tools
Thomas KochFrOSCon St.Augustin 26. August 2012
1Sonntag, 26. August 12
über mich• Thomas Koch
• Generation 40+
• Software-Entwickler
• Python, JavaScript, Java ...
• Python User Group PyCologne
• OrbiTeam Software
• Bonn
• BSCW Collaboration Server(Python powered ,-)
2Sonntag, 26. August 12
Agenda
• Überblick Lucene / Solr - was ist das?
• Grundlegende Konzepte IR
• PyLucene: Details und Beispiele
• Solr: Details und Beispiele
• Weitere Informationsquellen
3Sonntag, 26. August 12
Apache Lucene
• Lucene Core
• Java-basiertes Framework für Indexing und Suche
• bietet API zur Entwicklung von Suchkomponenten
• basiert auf invertiertem Index (und effizienter Verwaltung desselben...)
4Sonntag, 26. August 12
Apache Solr
• Solr ist ein Such-Server auf Basis von Lucene Core (in Java)
• Out-of-the-Box: enthält alle notwendigen Komponenten und Beispiel-Konfiguration
• Easy-to-use: HTML Admin GUI und vordefiniertes Such GUI(für GUI Prototypen - sog. Solaritas)
5Sonntag, 26. August 12
Gemeinsamkeiten
• Lucene & Solr sind...
• Open Source (Apache 2.0 Lizenz)
• in Java entwickelt
• gut dokumentiert
• flexibel erweiterbar
• stabil und leistungsfähig
6Sonntag, 26. August 12
Unterschiede• Lucene ist ein Framework zur Entwicklung von
Suchmaschinen
• Solr ist eine Server-Software, die Indizierung und Suche als Service bereitstellt
• Programmieraufgaben in Lucene sind Konfigurationsaufgaben in Solr
• Programmierung mit Lucene erfolgt in Java(mittels PyLucene auch in Python)
• Schnittstellen zu Solr sind sprachunabhängig (Rest-like API, Standard-Formate wie XML und JSON)
7Sonntag, 26. August 12
GRUNDLEGENDE KONZEPTETheorie
8Sonntag, 26. August 12
Grundlagen• Suchraumaufbereitung
• Erfassen der Objekte und Informationsextraktion
• z.B. Extraktion der Daten (Web-Crawler, DB-Export)
• ggf. Konvertierung (z.B. unterschiedliche Dokument-Formate nach Text)
• Indexierung
• Textaufbereitung und -erfassung im Suchindex - nach Suchraumaufbereitung
• beinhaltet u.a. Textanalyse (folgt)
• Bedeutet i.W. Aktualisierung und Optimierung der Index-Strukturen
• Index: Daten/Dateistrukturen für effiziente Suche (und Index-Aktualisierung)
• Wesentliche Unterschiede zu klassischen relationalen Datenbanken:kein Schema, keine Joins
9Sonntag, 26. August 12
Grundlagen• Textanalyse
• Vorverarbeitung der Ausgangsdaten (Texte) in ,Wörter‘ (Terme)
• mittels Stemmer, Tokenizer, Filter etc. z.B. durch...
• Normalisierung (whitespace removal, lowercase etc.)
• Entfernung von Stop-Wörtern (he, she, it … // der, die, das…)
• Hinzufügen von Synonymen (SynonymFilter)
• Reduzierung auf Stammform - Stemming (z.B. Häuser => Haus)
• ist i.d.R. Sprachabhängig!
10Sonntag, 26. August 12
Grundlagen• Suche
• mittels einer Abfragesprache (Query Language)
• Verknüpfung von Suchausdrücken per boolscher Logik (AND, OR etc.)
• basiert auf Matching-Algorithmen
• liefert Treffer (Hits) und Ranking (Scores)
• Trefferanzeige
• letzter Schritt: Visualisierung der Suchergebnisse (Anwendungsabhängig)
• kann interaktive Verfeinerung der Suche unterstützen(z.B. Facetted Search, Filter)
11Sonntag, 26. August 12
Theorie & Praxis• Suchraumaufbereitung
• Ist i.d.R. Anwendungssache (und domain-spezifisch)
• Konvertierung: Apache Tika!
• Textanalyse
• StandardAnalyzer, SnowballFilter, PorterStemFilter, GermanAnalyzer
• Indexierung
• IndexWriter, Document, Field
• Suche
• IndexSearcher, QueryParser, Term
• Trefferanzeige
• Hit, hit.score, Explanation
12Sonntag, 26. August 12
Index, Document, Field
• Index verwaltet Dokumente (,Document‘)(abstraktes Objekt)
• pro Dokument: verschiedene Attribute
• Metadaten bzw. Felder (,Fields‘)
• grob: key-value pair
• Inhalte werden im (invertierten) Index verwaltet
13Sonntag, 26. August 12
Index-Struktur (on-disc)
• Grundlage einer index-basierten Suchmaschine: invertierter Index
14Sonntag, 26. August 12
Index-Struktur (in memory / Objekt-Modell)
• Inhalte, die durchsucht werden sollen, müssen in Dokumente & Felder (Documents & Fields) transformiert werden => Denormalisierung
• Beispiele für Dokumente:– E-mail, PDF-Dokument,
Wikipedia-Artikel etc.
• Beispiele für Felder (Field): – Autor, Content,
Änderungsdatum, Titel, Abstract, Keywords etc.
Dokument
….Feld
…Term Term
Feld…Term Term
Dokument….
Index
15Sonntag, 26. August 12
PyLucene
16Sonntag, 26. August 12
Apache PyLucene• Lucene Core
• Java-basiertes Framework für Indexing und Suche
• cross platform: 100%-pure Java
• PyLucene
• Python Portierung von Lucene Core (über JCC)
• API-kompatibel und Index-kompatibel
• JCC-Projekt: C++ code-Generator
• Anbindung von Java-Klassen/Packages an Python (über JNI)
• Python Module aus PyLucene sind durch JCC generiert (direkt aus den Lucene Core Java-Sourcen)
• Generierter Code integriert eine Java VM in den Python-Prozess
17Sonntag, 26. August 12
(Py)Lucene Features
• Wildcard Search („Pyth*“)
• Fuzzy Search (unscharfe Suche)
• Phrase Query („deutsche Einheit“)
• Related Search (‚More like this‘)
• Spell Checker (‚Did you mean …‘)
• Hit highlighting (Trefferhervorhebung)
18Sonntag, 26. August 12
Aufbau von PyLucene• Anwendung
(eigener Code)
• PyLucene(Framework)
• Storage(File, RAM, DB,…)
Index
IndexWriter IndexSearcher
19Sonntag, 26. August 12
Lucene Details
• Anforderungen
• Lucene: Java 1.5+, Ant 1.7+
• PyLucene: Java 1.4+, Python 2.3+
• Aktuelle Version (08/2012)
• Stable: Apache (Py)Lucene 3.6.1
• Apache (Py)Lucene 4.0-ALPHA
20Sonntag, 26. August 12
PYLUCENE DEMOPraxisbeispiele
21Sonntag, 26. August 12
PyLucene: Erste Schritte• Getting Started: Download, Build & Run
• Download tar.gz, extract, build ...
• JCC => <Lib>/site-packages/JCC-2.14-py2.7-<platform>.egg
• Lucene => <Lib>/site-packages/lucene-3.6.1-py2.7-<platform>.egg
22Sonntag, 26. August 12
PyLucene: Erste Hürden• Build erfordert: java, gcc, ant, python, setuptools
• PyLucene enthält Java Lucene Core
• Unix/MacOS: Anpassung Makefile
• Windows: MinGW/Cygwin oder MS-VC Compiler
• Runtime erfordert: java & python
• Pre-compiled binaries: PyLucene Extras Projekthttp://code.google.com/a/apache-extras.org/p/pylucene-extra/
• Hinweise zu Stolpersteinen im Wiki
23Sonntag, 26. August 12
PyLucene im Interpreter
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) [GCC 4.2.1 (Based on Apple Inc. build 5658)] Type "help", "copyright", "credits" or "license"
>>> import lucene>>> lucene.VERSION'3.6.0'>>> x = lucene.initVM()>>> x<jcc.JCCEnv object at 0x106ef8138>>>> x.java_versionu'1.6.0_33'>>> lucene.Document<type 'Document'>>>> lucene.IndexWriter<type 'IndexWriter'>
24Sonntag, 26. August 12
Beispiel: Indexierung• Inhalte hinzufügen:
IndexWriter und Document
• Eigenschaften der Felder: Stored (yes/no), Analyzed (yes/no)
•
store = lucene.SimpleFSDirectory(lucene.File(storeDir)) analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)writer = lucene.IndexWriter(store, analyzer, True, #create lucene.IndexWriter.MaxFieldLength.LIMITED)
for file in files: doc = lucene.Document() doc.add(lucene.Field("path", get_path(file), lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) doc.add(lucene.Field("contents", file.readlines(), lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) writer.addDocument(doc) # index document
25Sonntag, 26. August 12
Beispiel: Suche
• Inhalt suchen: IndexReader und Hits
• Suchanfrage: mittel Queryparser
directory = SimpleFSDirectory(File(storeDir))searcher = IndexSearcher(directory, True) # readOnlyanalyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
query = QueryParser("contents", analyzer).parse(queryStr)# perform query on index and get max=50 resultsscoreDocs = searcher.search(query, 50).scoreDocs# finally show results for scoreDoc in scoreDocs: doc = searcher.doc(scoreDoc.doc) # get Document from index print ‘match:', doc.get("path")
26Sonntag, 26. August 12
PyLucene Demo• Ziel: Suchmaschine für Liedtitel
• Datenquelle: http://musicbrainz.org
• Vorgehen:
• Script für Index-Erstellung (aus CSV)
• Script zur Suche über Index
• Laufzeit:
• Index mit ca. 7 Mio. Tracks aus MusicBrainz wird in 7:34s erstellt (ca. 600 MB Index)
27Sonntag, 26. August 12
Solr
28Sonntag, 26. August 12
Apache Solr• Solr = Such-Server auf Basis von Lucene Core
mit REST-like API.• Solr basiert auf der Lucene Search Library
und erweitert diese• Solr arbeitet in Servlet Containern wie Apache
Tomcat (oder Jetty)• Indexing: „Dokumente“ zum Index hinzufügen• via XML oder JSON - über HTTP
• Suche: query Solr via HTTP GET • Ergebnis als XML oder JSON
29Sonntag, 26. August 12
• Perfomance• Optimized for High Volume Web Traffic: highly configurable Caching• Fast Incremental Updates and Index Replication
• Highly scalable distributed search (sharded index across multiple hosts)
• Features• Faceted Search und Filter• Extraktion von Inhalt und Metadaten (via Apache Tika)• Alternative Query Parser (dismax, edismax) und Geo-Suche (Distanz)• Data Schema (Numeric Types, Dynamic Fields, Unique Keys…)
• Offen• Diverse Client APIs für Java, Unix(shell-script), Python etc.
• Flexibel • hochgradig anpassbar (XML-Konfigurationsdateien)• erweiterbar (Lucene/Solr plugins)
Solr: Features
30Sonntag, 26. August 12
• Solr Server• Basiert auf Servlets (Jetty, Tomcat o.ä.)• Wird durch Konfigurationsdateien angepasst (XML)
• z.B. schema.xml , solr.xml
• Bietet „REST-like“ API• z.B. http://localhost:8983/solr/update/csv
• Erlaubt add,update,delete über HTTP-Interface• z.B. einfacher POST einer XML-Datei• andere HTTP-Schnittstellen für CSV, PDF etc.
• Kann sich auch Daten „ziehen“ (Pull)• Über RSS-Feed oder DB-Adapter
• Skaliert durch Replication (Master/Slave)
Solr: Architektur
31Sonntag, 26. August 12
Lucene/Solr Architecture
32
Apache Lucene
/select /spell XML CSVXML Binary JSON
Data Import Handler (SQL/
RSS)
Extracting RequestHandler
(PDF/WORD)
CachingFaceting
Query Parsing
Apache Tika
binary/admin
High-lighting
Schema
Index Replication
Request Handlers Update HandlersResponse Writers
QuerySearch Components
SpellingFaceting
Highlighting SignatureLogging
Update Processors
Indexing
Config
DebugStatistics
More like this
Distributed Search
Clustering
Filtering Search
Core SearchIndexReader/
SearcherIndexing
IndexWriterText Analysis
Analysis
32Sonntag, 26. August 12
33
Solr Indexing
8
XML Update Handler
CSV Update Handler
/update /update/csvXML Update with custom processor
chain
/update/xml
Solr CELL: Extracting
RequestHandler(PDF, Word, …)
via Apache Tika
/update/extract
Lucene Index
Data ImportHandler
Database pullRSS pullSimple
transformsSQL DB
RSS feed
<doc> <title>
Signatureprocessor
Loggingprocessor
Indexprocessor
Custom Transformprocessor
HTTP POSTHTTP POST
pull
pull
Update Processor Chain (per handler)
Lucene
Text Index Analyzers
33Sonntag, 26. August 12
Solr Details
• Getting Started
• Anforderung: Java 1.5+
• Tutorial: http://lucene.apache.org/solr/tutorial.html
• Aktuelle Version (08/2012)
• Stable: Apache Solr 3.6.1 (ca. 90 MB)
• Apache Solr 4.0-ALPHA
34Sonntag, 26. August 12
SOLR DEMOPraxisbeispiele
35Sonntag, 26. August 12
Getting started• Download, Configure & Run
• Etliche XML-Konfigurationsdateien in conf
• solrconfig.xml Allgemeine Konfiguration zu Lucene, Directories, Web
• schema.xml Datenschema für Suchfelder
• Start Server $ java -jar start.jar
• Open Browser: http://localhost:8983/solr/ bzw. /solr/browse
36Sonntag, 26. August 12
Solr: Adding Datajava -jar post.jar data.xml|.json|.csv
• ipod_video.xml
37Sonntag, 26. August 12
• Kein integrierter Python Client• Note: As of version 1.3, Solr no longer comes bundled with a
Python client. The existing client was not sufficiently maintained or tested as development of Solr progressed, and committers felt that the code was not up to our usual high standards of release.
• Verschiedene Bindings für Solr verfügbar• solrpy: a python client for solr
http://code.google.com/p/solrpy/• Sunburnt: a python-solr interface
https://github.com/tow/sunburnt• Und mehr im Solr-Wiki …
http://wiki.apache.org/solr/SolPython
Solr & Python
38Sonntag, 26. August 12
• Import und Suche via Python
• mittels eines Python clients für Solr
• Basis: SolrPy
• a lightweight Python wrapper for Apache Solr
• allows to add documents to a Solr instance
• and to perform queries and gather search results from Solr using Python.
Solr: Demo
39Sonntag, 26. August 12
Solr: Beispiel
• Datenquelle: http://musicbrainz.org
• Daten: vorkonfigurierte Solr-Instanz (aus Solr Buch) mit Tracks, Artists, Releases
• Demo:
• Solr Admin GUI
• Script zur Suche über Solr
40Sonntag, 26. August 12
Weitere Infos• Solr Buch
• www.solrenterprisesearchserver.com
• Lucene Buch
• http://www.manning.com/hatcher2/
• Lucene / PyLucene
• http://lucene.apache.org /pylucene
• PySolr
• https://github.com/toastdriven/pysolr
• Lucene Revolution (Konferenz)
• http://www.lucenerevolution.org
41Sonntag, 26. August 12
Copyrights• Apache Lucene, Apache Solr, Apache PyLucene and their respective logos are
trademarks of The Apache Software Foundation.
• All other marks mentioned may be trademarks or registered trademarks of their respective owners.
• Bildquellen:
• Logos: python.org, lucene.apache.org, pycologne.de
• Bücher: packtlib, Manning
• Eier: http://www.lsg.musin.de/portal/Datei:Eier.jpg
• Theoriecartoon: http://kunststoffreport.de
• Google Search Resultshttps://developers.google.com/custom-search/images/start_google_wheels_result.png
• Foto Robert Harding (Hürden): dpa / RP online
• Lucene/Solr Architecture, Inverted Index:http://people.apache.org/~yonik/presentations
42Sonntag, 26. August 12
• ?• Source Code (der Beispiele)
• http://code.google.com/p/lucenesolrdemo/source/browse
• Apache PyLucene Community– mailing list: [email protected]– svn: http://svn.apache.org/repos/asf/lucene/pylucene/
Fragen
43Sonntag, 26. August 12
Kontakt / Fragen
• Thomas Koch
• Twitter: @tomy_koch
• eMail: [email protected]
• PyCologne:
• http://www.pycologne.de
• Treffen: jeden 2.Mittwoch in Köln
44Sonntag, 26. August 12