1. Apache Lucene / Solr
Volltextsuche mit Open Source Tools
Thomas Koch
FrOSCon St.Augustin
26. August 2012
Sonntag, 26. August 12 1
2. über mich
• Thomas Koch
• Generation 40+
• Software-Entwickler
• Python, JavaScript, Java ...
• Python User Group PyCologne
• OrbiTeam Software
• Bonn
• BSCW
Collaboration Server
(Python powered ,-)
Sonntag, 26. August 12 2
3. Agenda
• Überblick Lucene / Solr - was ist das?
• Grundlegende Konzepte IR
• PyLucene: Details und Beispiele
• Solr: Details und Beispiele
• Weitere Informationsquellen
Sonntag, 26. August 12 3
4. Apache Lucene
• Lucene Core
• Java-basiertes Framework für Indexing
und Suche
• bietet API zur Entwicklung von
Suchkomponenten
• basiert auf invertiertemdesselben...)
(und effizienter Verwaltung
Index
Sonntag, 26. August 12 4
5. 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)
Sonntag, 26. August 12 5
6. Gemeinsamkeiten
• Lucene & Solr sind...
• Open Source (Apache 2.0 Lizenz)
• in Java entwickelt
• gut dokumentiert
• flexibel erweiterbar
• stabil und leistungsfähig
Sonntag, 26. August 12 6
7. 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)
Sonntag, 26. August 12 7
8. Theorie
GRUNDLEGENDE KONZEPTE
Sonntag, 26. August 12 8
9. 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
Sonntag, 26. August 12 9
10. 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!
Sonntag, 26. August 12 10
11. 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)
Sonntag, 26. August 12 11
13. 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
Sonntag, 26. August 12 13
14. Index-Struktur
(on-disc)
• Grundlage einer index-basierten
Suchmaschine: invertierter Index
Sonntag, 26. August 12 14
15. Index-Struktur
(in memory / Objekt-Modell)
• Inhalte, die durchsucht werden
sollen, müssen in Dokumente & Index
Felder (Documents & Fields)
transformiert werden Dokument
=> Denormalisierung Feld
• Beispiele für Dokumente: Term … Term
– E-mail, PDF-Dokument,
….
Wikipedia-Artikel etc. Feld
• Beispiele für Felder (Field): Term … Term
– Autor, Content,
Änderungsdatum,
Titel, Abstract,
Dokument
Keywords etc. ….
Sonntag, 26. August 12 15
17. 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
Sonntag, 26. August 12 17
18. (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)
Sonntag, 26. August 12 18
19. Aufbau von PyLucene
• Anwendung
(eigener Code)
• PyLucene
(Framework) IndexWriter IndexSearcher
• Storage
(File, RAM, DB,…)
Index
Sonntag, 26. August 12 19
23. 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 Projekt
http://code.google.com/a/apache-extras.org/p/pylucene-extra/
• Hinweise zu Stolpersteinen im Wiki
Sonntag, 26. August 12 23
24. 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_version
u'1.6.0_33'
>>> lucene.Document
<type 'Document'>
>>> lucene.IndexWriter
<type 'IndexWriter'>
Sonntag, 26. August 12 24
25. Beispiel: Indexierung
• Inhalte hinzufügen:
IndexWriter und Document
store = lucene.SimpleFSDirectory(lucene.File(storeDir))
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
writer = lucene.IndexWriter(store, analyzer, True, #create
lucene.IndexWriter.MaxFieldLength.LIMITED)
• Eigenschaften der Felder: Stored (yes/no), Analyzed (yes/no)
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
Sonntag, 26. August 12 25
26. Beispiel: Suche
• Inhalt suchen: IndexReader und Hits
directory = SimpleFSDirectory(File(storeDir))
searcher = IndexSearcher(directory, True) # readOnly
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
• Suchanfrage: mittel Queryparser
query = QueryParser("contents", analyzer).parse(queryStr)
# perform query on index and get max=50 results
scoreDocs = 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")
Sonntag, 26. August 12 26
27. 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)
Sonntag, 26. August 12 27
29. 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
Sonntag, 26. August 12 29
30. Solr: Features
• 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)
Sonntag, 26. August 12 30
31. Solr: Architektur
• 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)
Sonntag, 26. August 12 31
32. Lucene/Solr Architecture
Request Handlers Response Writers Update Handlers
/admin /select /spell XML Binary JSON XML CSV binary
Search Components Update Processors
Query Highlighting Signature Extracting
Spelling Statistics Schema Logging
Request
Handler
Faceting Debug Indexing (PDF/WORD)
More like this Clustering Apache Tika
Query
Parsing
Distributed Search Config Data Import
Handler (SQL/
Analysis
RSS)
High-
Faceting Filtering Search Caching
lighting
Index
Replication
Core Search Apache Lucene Indexing
IndexReader/
Text Analysis IndexWriter
Searcher
32
Sonntag, 26. August 12 32
33. <doc>
Solr Indexing PDF
<title> HTTP POST
HTTP POST
/update /update/csv /update/xml /update/extract
XML Update Solr CELL:
XML Update CSV Update with custom Extracting
Handler Handler processor RequestHandler
chain (PDF, Word, …)
via Apache Tika
Update Processor Chain (per handler)
Text Index
RSS Signature Analyzers
pull Data Import processor
feed Handler
Custom Transform Lucene
Database pull processor
RSS pull Logging
pull
Simple processor
SQL DB
transforms
Index Lucene Index
processor
8 33
Sonntag, 26. August 12 33
36. 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
Sonntag, 26. August 12 36
37. Solr: Adding Data
java -jar post.jar data.xml|.json|.csv
• ipod_video.xml
Sonntag, 26. August 12 37
38. Solr & Python
• 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
Sonntag, 26. August 12 38
39. Solr: Demo
• 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.
Sonntag, 26. August 12 39
40. 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
Sonntag, 26. August 12 40
41. 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
Sonntag, 26. August 12 41
42. 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 Results
https://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
Sonntag, 26. August 12 42