Volltextsuche mit Lucene und Solr

  • 4,365 views
Uploaded on

German talk about Apache Lucene and Solr - mainly from a Python Developer's perspective.

German talk about Apache Lucene and Solr - mainly from a Python Developer's perspective.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,365
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
25
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Apache Lucene / Solr Volltextsuche mit Open Source Tools Thomas Koch FrOSCon St.Augustin 26. August 2012Sonntag, 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 InformationsquellenSonntag, 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 IndexSonntag, 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ähigSonntag, 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 KONZEPTESonntag, 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 JoinsSonntag, 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
  • 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, ExplanationSonntag, 26. August 12 12
  • 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 verwaltetSonntag, 26. August 12 13
  • 14. Index-Struktur (on-disc) • Grundlage einer index-basierten Suchmaschine: invertierter IndexSonntag, 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
  • 16. PyLuceneSonntag, 26. August 12 16
  • 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-ProzessSonntag, 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,…) IndexSonntag, 26. August 12 19
  • 20. 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-ALPHASonntag, 26. August 12 20
  • 21. Praxisbeispiele PYLUCENE DEMOSonntag, 26. August 12 21
  • 22. 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>.eggSonntag, 26. August 12 22
  • 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 WikiSonntag, 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 u1.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 documentSonntag, 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
  • 28. SolrSonntag, 26. August 12 28
  • 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 JSONSonntag, 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 32Sonntag, 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 processorSQL DB transforms Index Lucene Index processor 8 33Sonntag, 26. August 12 33
  • 34. 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-ALPHASonntag, 26. August 12 34
  • 35. Praxisbeispiele SOLR DEMOSonntag, 26. August 12 35
  • 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/browseSonntag, 26. August 12 36
  • 37. Solr: Adding Data java -jar post.jar data.xml|.json|.csv • ipod_video.xmlSonntag, 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/SolPythonSonntag, 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 SolrSonntag, 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.orgSonntag, 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/presentationsSonntag, 26. August 12 42
  • 43. Fragen • • Source Code (der Beispiele) ? • http://code.google.com/p/lucenesolrdemo/source/ browse • Apache PyLucene Community – mailing list: pylucene-dev@lucene.apache.org – svn: http://svn.apache.org/repos/asf/lucene/pylucene/Sonntag, 26. August 12 43
  • 44. Kontakt / Fragen • Thomas Koch • Twitter: @tomy_koch • eMail: thomas.koch@pycologne.de • PyCologne: • http://www.pycologne.de • Treffen: jeden 2.Mittwoch in KölnSonntag, 26. August 12 44