SlideShare a Scribd company logo
1 of 19
Die Nadel im Heuhaufen – Indexbasierte Volltextsuche mit PyLucene Thomas Koch OrbiTeam Software, Bonn koch@orbiteam.de @tomy_koch
Agenda Was ist PyLucene? Einsatzbereiche von PyLucene Wie funktioniert eine Suchmaschine? Aufbau & Anwendung von PyLucene  Code-Beispiele Weiterführende Themen & Projekte Historie Fragen Okt.2011 TKo@PyCon-DE 2
Was ist PyLucene? PyLucene = Python + Lucene Lucene: Java-Bibliothek für Suchmaschinen Apache Lucene Core™ (formerly named Lucene Java) Bietet API zurIndexierungund Suche Open Source, 100% pure Java PyLucene: Python Portierung von Lucene Core (de-facto eher eine  Art „Wrapper“ um Java Lucene) Apache PyLucene™ :  Unterprojekt von Apache Lucene™  API-kompatibel mit LuceneCore Index-kompatibel mit Lucene Core  AlleFeaturesvon Java-Lucene in Python! Website: http://lucene.apache.org/pylucene/  Apache-Lizenz TKo@PyCon-DE 3
Was ist PyLucene nicht? PyLucene ist keine fertige Suchmaschine also  ≠ ht://Dig , Swish etc. aber: Bibliothek ermöglicht einfache Entwicklung einer Textsuchmaschine mit voller Funktionalität! PyLucene ist nicht einfach zu installieren ,-( nicht im Python Package Index debianpackage veraltet Installation erfordert Java, C++-Compiler, Ant, make … aber: es geht! … und läuft auf Unix, Mac-OS, Windows Okt.2011 TKo@PyCon-DE 4
Einsatzbereiche von {Py}Lucene Desktop-Suche 	 Dokumente(auf HDD) erfassen (z.B. via os.walkdiro.ä.) Dokumente konvertieren (z.B. pdf2txt) u. indexieren (lucene) ‚natives‘ Such-GUI (Desktop UI) -  Bsp. eccencaDiscoverer Volltextsuche in Email-Archiven Dokumente erfassen: Emails aus Archiv extrahieren Erfassen von Metadaten (Attribute: from, date, subject …) Dokumente indexieren (lucene)und über Such-GUI finden Bsp. Using Python and Lucene to Search Outlook Email 		     http://www.xml.com/lpt/a/1207 Web-Suche Dokumente erfassen: Crawler Dokumente konvertieren (HTML2TXT) und indexieren Web-basiertes Such-GUI (z.B. wie google ,-) Bsp.  Apache Nutch Projekt 5
Wie funktioniert eine Suchmaschine? Suchraumaufbereitung Erfassen der Objekte und Informationsextraktion Indexierung Textaufbereitung und -erfassung im Suchindex Aktualisierung und Optimierung der Index-Strukturen Suche Anfragebearbeitung (mittels ‚querylanguage‘) Durchführung der Suche auf dem Index Ergebnisdarstellung GUI mit Trefferliste, Details, Ranking etc. Okt.2011 TKo@PyCon-DE 6
Wo hilft uns PyLucene? Suchraumaufbereitung “Lucene does not care about the Parsing of document formats”  Aufgabe der Anwendung! Indexierung Textanalyse		 StandardAnalyzer Indexierung		 IndexWriter, Document, Field Index-Optimierung 	 writer.optimize() Suche Anfragen formulieren  	 QueryParser, Term Suche  			 IndexSearcher Ergebnisdarstellung Ergebnisse iterieren	forhit in searcher.search(query) Details & Ranking etc.	hit.score, Explanation, … Okt.2011 TKo@PyCon-DE 7
Aufbau von PyLucene Anwendung(eigener Code) PyLucene(Framework) Storage(File, RAM, DB,…) IndexWriter IndexSearcher Index Okt.2011 TKo@PyCon-DE 8
Herausforderungen bei der Suche & Indexierung  Textanalyse Aufbereitung von Texten  Zerlegung in Tokens (für invertierten Index) Stop-Word-Removal(he, she, it … // der, die, das…) Normalisierung (lowercase etc.) Wortstammreduzierung (Stemming) Sprachabhängig! (Py)Lucene bietet verschiedene Tools StandardAnalyzer SnowballFilter PorterStemFilter GermanAnalyzer  Geeigneten Analyzer auswählen …     … oder eigenen entwickeln Okt.2011 TKo@PyCon-DE 9
Struktur: Dokumente und Felder Okt.2011 TKo@PyCon-DE 10 Index Dokument …. 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. Feld… Feld… Term Term Term Term Dokument….
Anwendung von PyLucene: Indexierung Index anlegen Inhalte zum Index hinzufügen TKo@PyCon-DE 11 importlucene store  = lucene.SimpleFSDirectory(lucene.File(storeDir))  analyzer = StandardAnalyzer(Version.LUCENE_CURRENT) writer= lucene.IndexWriter(store, analyzer, True,  #create lucene.IndexWriter.MaxFieldLength.LIMITED) forfile in files: doc = lucene.Document() doc.add(lucene.Field("path", get_path(file), lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) contents = file.readlines() doc.add(lucene.Field("contents", contents,                           lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) writer.addDocument(doc) # indexdocument
Anwendung von PyLucene: Suche Suchanfrage vorbereiten Suchanfrage durchführen Okt.2011 TKo@PyCon-DE 12 directory = SimpleFSDirectory(File(storeDir)) searcher = IndexSearcher(directory, True) # readOnly analyzer = StandardAnalyzer(Version.LUCENE_CURRENT) query= QueryParser("contents", analyzer).parse(queryStr) # performquery on indexandgetmax=50 results scoreDocs = searcher.search(query, 50).scoreDocs # finallyshowresults forscoreDoc in scoreDocs: doc= searcher.doc(scoreDoc.doc)     # getDocumentfromindex print‘match:', doc.get("path")
Anwendung von PyLucene: Tipps PyLucene Initialisierung  vor dem Aufruf von PyLucene muss JVM geladen werden Angabe weiterer VM-Parameter möglich: initialheap, vmargs etc. PyLucene Konfiguration und Optimierung writer.setMaxBufferedDocs(int)  minimal number of documents before the buffered documents are flushed  writer.setMaxFieldLength(int)  maximum number of terms per field writer.optimize() Index-Optimierung anstoßen (synchron oder asynchron) writer.close() Auch auf reader und searcher immer close() aufrufen! Okt.2011 TKo@PyCon-DE 13 importlucene lucene.initVM(classpath=lucene.CLASSPATH)
Weiterführende Themen: Werkzeuge Lucene Index Viewer Luke - Lucene Index Toolbox  Java-Anwendungmit GUI Anzeige von Index-Inhalten http://code.google.com/p/luke pylucene-extra FertigePyLucene (und JCC) eggs  FürverschiedenePlattformen und Python-Versionen easy_installJCC-2.11-py2.7-win32.egg easy_installlucene-3.4.0-py2.7-win32.egg python import lucene http://code.google.com/a/apache-extras.org/p/pylucene-extra Okt.2011 TKo@PyCon-DE 14
Weiterführende Themen: Literatur ,[object Object],i.d.R. 1:1 auf Python übertragbar, aber: Reduktion in einpackage! Java:   import org.apache.lucene.index.IndexReader; Python: import lucene.IndexReader http://lucene.apache.org/java/docs/ Lucene in Action Erik Hatcher and Otis Gospodnetic (EN) Beispiel-Code aus LIA-Buch in Distribution Verlag: Manning Pub. (2nd Edition) http://www.manning.com/hatcher2/ Indizierung mit Lucene Dr. Christian Herta  (DE) Unterlagen zur Vorlesung Information Retrieval und Suchtechnologien http://www.christianherta.de Okt.2011 TKo@PyCon-DE 15
Weiterführende Themen: Solr Apache Solr A powerful enterprise search server built on top of Lucene. Features:  hithighlighting, facetedsearch, dynamicclustering, caching, replication, richdocumenthandling (e.g., Word, PDF) http://lucene.apache.org/solr What about PySolr ?! SolrPy  is a Python client for Solr and allows you to add documents to a Solr instance, and then to perform queries and gather search results from Solr using Python. http://pypi.python.org/pypi/solrpy MontySolris an open source extension that makes it possible to include Python code inside Solr You can call Python routines from the Java side, as well as control (most of the) Solr operations from the Python side. https://github.com/romanchyla/montysolr Okt.2011 TKo@PyCon-DE 16
Exkurs - PyLucene: poweredby JCC Java-Code in Python ‚einbetten‘ Jpype allow python programs fullaccess to java class libraries Achieved through interfacingat the native level in both Virtual Machines. http://jpype.sourceforge.net JCC a C++ codegeneratorthatmakesitpossibletocallinto Java classesfrom Python via Java's Native Invocation Interface (JNI) Python Module aus PyLucene sind durch JCC generiert (direkt aus den Lucene-Java-Sourcen) So generierter Code integriert automatische eine Java VM in den Python-Prozess ,[object Object],s. auch http://www.slideshare.net/onyame/java-und-python-das-beste-aus-beiden-welten-nutzen importjcc jcc.initVM() Okt.2011 TKo@PyCon-DE 17 fromjpypeimport * startJVM("jvm.dll", "-ea") java.lang.System.out.println("hi") shutdownJVM()
Historie Entwicklung von PyLucene Lucene 1.0: entwickelt von Doug Cutting(2000) http://cutting.wordpress.com/ PyLucene : entwickelt von Andi Vajda Zunächst GCJ-compiledversionof Java Luceneintegratedwith Python (~2004) Später als JCC-generated Python wrapperaround Java Lucene (2007) Siehe  http://blog.chandlerproject.org/author/vajda/ Seit V2.4 (2009): Unterprojekt von Apache Lucene  Vormals OSF nun ASF (Open Apache Software Foundation) Aktuelle Release : PyLucene 3.4.0 (Juli 2011)  / JCC-2.11 Erscheint i.d.R. in enger Zeitfolge zur Java Lucene Release Okt.2011 TKo@PyCon-DE 18
Fragen Apache PyLucene Community mailing list: pylucene-dev@lucene.apache.org svn: http://svn.apache.org/repos/asf/lucene/pylucene/ ? Okt.2011 TKo@PyCon-DE 19

More Related Content

Similar to PyLucene@PyCon DE 2011

Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenChristian Münch
 
Python-IDEs - PyDev und Eclipse
Python-IDEs - PyDev und EclipsePython-IDEs - PyDev und Eclipse
Python-IDEs - PyDev und EclipseThomas Koch
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeldgedoplan
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Managementinovex GmbH
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python Andreas Schreiber
 
fn project serverless computing
fn project serverless computingfn project serverless computing
fn project serverless computingWolfgang Weigend
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenHendrik Lösch
 
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"Aberla
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederChristoph Pickl
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Michael Romer
 
Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?.NET User Group Dresden
 
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel OnkopediaBack to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel OnkopediaAndreas Jung
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure NotebooksTEitelberg
 
Webbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverWebbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverAndi Albrecht
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Oliver Klee
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsAndreas Schulte
 

Similar to PyLucene@PyCon DE 2011 (20)

Abläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisierenAbläufe mit PHP und Phing automatisieren
Abläufe mit PHP und Phing automatisieren
 
Python-IDEs - PyDev und Eclipse
Python-IDEs - PyDev und EclipsePython-IDEs - PyDev und Eclipse
Python-IDEs - PyDev und Eclipse
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
.NET zu .NET Core
.NET zu .NET Core.NET zu .NET Core
.NET zu .NET Core
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios Workshop
 
Opensource Tools für das Data Center Management
Opensource Tools für das Data Center ManagementOpensource Tools für das Data Center Management
Opensource Tools für das Data Center Management
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
 
fn project serverless computing
fn project serverless computingfn project serverless computing
fn project serverless computing
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf Steroiden
 
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
ESEconf2011 - Bosch Andy: "JavaServer Faces im Portal - Statusbestimmung"
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)
 
Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?Ist ADO.NET EntityFramework das bessere LINQ?
Ist ADO.NET EntityFramework das bessere LINQ?
 
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel OnkopediaBack to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
Back to the future - Plone 5.2 und Python 3 Migration am Beispiel Onkopedia
 
Azure Notebooks
Azure NotebooksAzure Notebooks
Azure Notebooks
 
Webbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriverWebbrowser-Automatisierung mit Python und Selenium WebDriver
Webbrowser-Automatisierung mit Python und Selenium WebDriver
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3
 
B3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite ApplicationsB3 Lotus Expeditor Und Composite Applications
B3 Lotus Expeditor Und Composite Applications
 

More from Thomas Koch

Einfache Heimautomatisierung auf dem Raspberry Pi mit Python
Einfache Heimautomatisierung auf dem Raspberry Pi mit PythonEinfache Heimautomatisierung auf dem Raspberry Pi mit Python
Einfache Heimautomatisierung auf dem Raspberry Pi mit PythonThomas Koch
 
CI Signal Light in less than 100 Line of Python Code
CI Signal Light in less than 100 Line of Python CodeCI Signal Light in less than 100 Line of Python Code
CI Signal Light in less than 100 Line of Python CodeThomas Koch
 
CI-Ampel für Jenkins mit RaspberryPi und Python
CI-Ampel für Jenkins mit RaspberryPi und PythonCI-Ampel für Jenkins mit RaspberryPi und Python
CI-Ampel für Jenkins mit RaspberryPi und PythonThomas Koch
 
Facettensuche mit Lucene und Solr
Facettensuche mit Lucene und SolrFacettensuche mit Lucene und Solr
Facettensuche mit Lucene und SolrThomas Koch
 
BSCW - Teamarbeit leicht gemacht
BSCW - Teamarbeit leicht gemachtBSCW - Teamarbeit leicht gemacht
BSCW - Teamarbeit leicht gemachtThomas Koch
 
Raspberry Pi und Python
Raspberry Pi und PythonRaspberry Pi und Python
Raspberry Pi und PythonThomas Koch
 
Einführung in Raspberry Pi und GPIO
Einführung in Raspberry Pi und GPIOEinführung in Raspberry Pi und GPIO
Einführung in Raspberry Pi und GPIOThomas Koch
 
Pandas und matplotlib im praktischen Einsatz
Pandas und matplotlib im praktischen EinsatzPandas und matplotlib im praktischen Einsatz
Pandas und matplotlib im praktischen EinsatzThomas Koch
 
EnArgus – ein ontologiebasiertes Forschungsinformationssystem
EnArgus – ein ontologiebasiertes ForschungsinformationssystemEnArgus – ein ontologiebasiertes Forschungsinformationssystem
EnArgus – ein ontologiebasiertes ForschungsinformationssystemThomas Koch
 
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...Thomas Koch
 
Volltextsuche mit Lucene und Solr
Volltextsuche mit Lucene und SolrVolltextsuche mit Lucene und Solr
Volltextsuche mit Lucene und SolrThomas Koch
 
Getting Started with Dojo Toolkit
Getting Started with Dojo ToolkitGetting Started with Dojo Toolkit
Getting Started with Dojo ToolkitThomas Koch
 
Teamarbeit 2.0 (PTF 2008)
Teamarbeit 2.0 (PTF 2008) Teamarbeit 2.0 (PTF 2008)
Teamarbeit 2.0 (PTF 2008) Thomas Koch
 

More from Thomas Koch (13)

Einfache Heimautomatisierung auf dem Raspberry Pi mit Python
Einfache Heimautomatisierung auf dem Raspberry Pi mit PythonEinfache Heimautomatisierung auf dem Raspberry Pi mit Python
Einfache Heimautomatisierung auf dem Raspberry Pi mit Python
 
CI Signal Light in less than 100 Line of Python Code
CI Signal Light in less than 100 Line of Python CodeCI Signal Light in less than 100 Line of Python Code
CI Signal Light in less than 100 Line of Python Code
 
CI-Ampel für Jenkins mit RaspberryPi und Python
CI-Ampel für Jenkins mit RaspberryPi und PythonCI-Ampel für Jenkins mit RaspberryPi und Python
CI-Ampel für Jenkins mit RaspberryPi und Python
 
Facettensuche mit Lucene und Solr
Facettensuche mit Lucene und SolrFacettensuche mit Lucene und Solr
Facettensuche mit Lucene und Solr
 
BSCW - Teamarbeit leicht gemacht
BSCW - Teamarbeit leicht gemachtBSCW - Teamarbeit leicht gemacht
BSCW - Teamarbeit leicht gemacht
 
Raspberry Pi und Python
Raspberry Pi und PythonRaspberry Pi und Python
Raspberry Pi und Python
 
Einführung in Raspberry Pi und GPIO
Einführung in Raspberry Pi und GPIOEinführung in Raspberry Pi und GPIO
Einführung in Raspberry Pi und GPIO
 
Pandas und matplotlib im praktischen Einsatz
Pandas und matplotlib im praktischen EinsatzPandas und matplotlib im praktischen Einsatz
Pandas und matplotlib im praktischen Einsatz
 
EnArgus – ein ontologiebasiertes Forschungsinformationssystem
EnArgus – ein ontologiebasiertes ForschungsinformationssystemEnArgus – ein ontologiebasiertes Forschungsinformationssystem
EnArgus – ein ontologiebasiertes Forschungsinformationssystem
 
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...
Wissenserschließung und –Modellierung: Ontologie vs. Volltextsuche am Beispie...
 
Volltextsuche mit Lucene und Solr
Volltextsuche mit Lucene und SolrVolltextsuche mit Lucene und Solr
Volltextsuche mit Lucene und Solr
 
Getting Started with Dojo Toolkit
Getting Started with Dojo ToolkitGetting Started with Dojo Toolkit
Getting Started with Dojo Toolkit
 
Teamarbeit 2.0 (PTF 2008)
Teamarbeit 2.0 (PTF 2008) Teamarbeit 2.0 (PTF 2008)
Teamarbeit 2.0 (PTF 2008)
 

PyLucene@PyCon DE 2011

  • 1. Die Nadel im Heuhaufen – Indexbasierte Volltextsuche mit PyLucene Thomas Koch OrbiTeam Software, Bonn koch@orbiteam.de @tomy_koch
  • 2. Agenda Was ist PyLucene? Einsatzbereiche von PyLucene Wie funktioniert eine Suchmaschine? Aufbau & Anwendung von PyLucene Code-Beispiele Weiterführende Themen & Projekte Historie Fragen Okt.2011 TKo@PyCon-DE 2
  • 3. Was ist PyLucene? PyLucene = Python + Lucene Lucene: Java-Bibliothek für Suchmaschinen Apache Lucene Core™ (formerly named Lucene Java) Bietet API zurIndexierungund Suche Open Source, 100% pure Java PyLucene: Python Portierung von Lucene Core (de-facto eher eine Art „Wrapper“ um Java Lucene) Apache PyLucene™ : Unterprojekt von Apache Lucene™ API-kompatibel mit LuceneCore Index-kompatibel mit Lucene Core  AlleFeaturesvon Java-Lucene in Python! Website: http://lucene.apache.org/pylucene/ Apache-Lizenz TKo@PyCon-DE 3
  • 4. Was ist PyLucene nicht? PyLucene ist keine fertige Suchmaschine also ≠ ht://Dig , Swish etc. aber: Bibliothek ermöglicht einfache Entwicklung einer Textsuchmaschine mit voller Funktionalität! PyLucene ist nicht einfach zu installieren ,-( nicht im Python Package Index debianpackage veraltet Installation erfordert Java, C++-Compiler, Ant, make … aber: es geht! … und läuft auf Unix, Mac-OS, Windows Okt.2011 TKo@PyCon-DE 4
  • 5. Einsatzbereiche von {Py}Lucene Desktop-Suche Dokumente(auf HDD) erfassen (z.B. via os.walkdiro.ä.) Dokumente konvertieren (z.B. pdf2txt) u. indexieren (lucene) ‚natives‘ Such-GUI (Desktop UI) - Bsp. eccencaDiscoverer Volltextsuche in Email-Archiven Dokumente erfassen: Emails aus Archiv extrahieren Erfassen von Metadaten (Attribute: from, date, subject …) Dokumente indexieren (lucene)und über Such-GUI finden Bsp. Using Python and Lucene to Search Outlook Email http://www.xml.com/lpt/a/1207 Web-Suche Dokumente erfassen: Crawler Dokumente konvertieren (HTML2TXT) und indexieren Web-basiertes Such-GUI (z.B. wie google ,-) Bsp. Apache Nutch Projekt 5
  • 6. Wie funktioniert eine Suchmaschine? Suchraumaufbereitung Erfassen der Objekte und Informationsextraktion Indexierung Textaufbereitung und -erfassung im Suchindex Aktualisierung und Optimierung der Index-Strukturen Suche Anfragebearbeitung (mittels ‚querylanguage‘) Durchführung der Suche auf dem Index Ergebnisdarstellung GUI mit Trefferliste, Details, Ranking etc. Okt.2011 TKo@PyCon-DE 6
  • 7. Wo hilft uns PyLucene? Suchraumaufbereitung “Lucene does not care about the Parsing of document formats”  Aufgabe der Anwendung! Indexierung Textanalyse StandardAnalyzer Indexierung IndexWriter, Document, Field Index-Optimierung writer.optimize() Suche Anfragen formulieren QueryParser, Term Suche IndexSearcher Ergebnisdarstellung Ergebnisse iterieren forhit in searcher.search(query) Details & Ranking etc. hit.score, Explanation, … Okt.2011 TKo@PyCon-DE 7
  • 8. Aufbau von PyLucene Anwendung(eigener Code) PyLucene(Framework) Storage(File, RAM, DB,…) IndexWriter IndexSearcher Index Okt.2011 TKo@PyCon-DE 8
  • 9. Herausforderungen bei der Suche & Indexierung Textanalyse Aufbereitung von Texten Zerlegung in Tokens (für invertierten Index) Stop-Word-Removal(he, she, it … // der, die, das…) Normalisierung (lowercase etc.) Wortstammreduzierung (Stemming) Sprachabhängig! (Py)Lucene bietet verschiedene Tools StandardAnalyzer SnowballFilter PorterStemFilter GermanAnalyzer  Geeigneten Analyzer auswählen … … oder eigenen entwickeln Okt.2011 TKo@PyCon-DE 9
  • 10. Struktur: Dokumente und Felder Okt.2011 TKo@PyCon-DE 10 Index Dokument …. 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. Feld… Feld… Term Term Term Term Dokument….
  • 11. Anwendung von PyLucene: Indexierung Index anlegen Inhalte zum Index hinzufügen TKo@PyCon-DE 11 importlucene store = lucene.SimpleFSDirectory(lucene.File(storeDir)) analyzer = StandardAnalyzer(Version.LUCENE_CURRENT) writer= lucene.IndexWriter(store, analyzer, True, #create lucene.IndexWriter.MaxFieldLength.LIMITED) forfile in files: doc = lucene.Document() doc.add(lucene.Field("path", get_path(file), lucene.Field.Store.YES, lucene.Field.Index.NOT_ANALYZED)) contents = file.readlines() doc.add(lucene.Field("contents", contents, lucene.Field.Store.NO, lucene.Field.Index.ANALYZED)) writer.addDocument(doc) # indexdocument
  • 12. Anwendung von PyLucene: Suche Suchanfrage vorbereiten Suchanfrage durchführen Okt.2011 TKo@PyCon-DE 12 directory = SimpleFSDirectory(File(storeDir)) searcher = IndexSearcher(directory, True) # readOnly analyzer = StandardAnalyzer(Version.LUCENE_CURRENT) query= QueryParser("contents", analyzer).parse(queryStr) # performquery on indexandgetmax=50 results scoreDocs = searcher.search(query, 50).scoreDocs # finallyshowresults forscoreDoc in scoreDocs: doc= searcher.doc(scoreDoc.doc) # getDocumentfromindex print‘match:', doc.get("path")
  • 13. Anwendung von PyLucene: Tipps PyLucene Initialisierung vor dem Aufruf von PyLucene muss JVM geladen werden Angabe weiterer VM-Parameter möglich: initialheap, vmargs etc. PyLucene Konfiguration und Optimierung writer.setMaxBufferedDocs(int) minimal number of documents before the buffered documents are flushed writer.setMaxFieldLength(int) maximum number of terms per field writer.optimize() Index-Optimierung anstoßen (synchron oder asynchron) writer.close() Auch auf reader und searcher immer close() aufrufen! Okt.2011 TKo@PyCon-DE 13 importlucene lucene.initVM(classpath=lucene.CLASSPATH)
  • 14. Weiterführende Themen: Werkzeuge Lucene Index Viewer Luke - Lucene Index Toolbox Java-Anwendungmit GUI Anzeige von Index-Inhalten http://code.google.com/p/luke pylucene-extra FertigePyLucene (und JCC) eggs FürverschiedenePlattformen und Python-Versionen easy_installJCC-2.11-py2.7-win32.egg easy_installlucene-3.4.0-py2.7-win32.egg python import lucene http://code.google.com/a/apache-extras.org/p/pylucene-extra Okt.2011 TKo@PyCon-DE 14
  • 15.
  • 16. Weiterführende Themen: Solr Apache Solr A powerful enterprise search server built on top of Lucene. Features: hithighlighting, facetedsearch, dynamicclustering, caching, replication, richdocumenthandling (e.g., Word, PDF) http://lucene.apache.org/solr What about PySolr ?! SolrPy is a Python client for Solr and allows you to add documents to a Solr instance, and then to perform queries and gather search results from Solr using Python. http://pypi.python.org/pypi/solrpy MontySolris an open source extension that makes it possible to include Python code inside Solr You can call Python routines from the Java side, as well as control (most of the) Solr operations from the Python side. https://github.com/romanchyla/montysolr Okt.2011 TKo@PyCon-DE 16
  • 17.
  • 18. Historie Entwicklung von PyLucene Lucene 1.0: entwickelt von Doug Cutting(2000) http://cutting.wordpress.com/ PyLucene : entwickelt von Andi Vajda Zunächst GCJ-compiledversionof Java Luceneintegratedwith Python (~2004) Später als JCC-generated Python wrapperaround Java Lucene (2007) Siehe http://blog.chandlerproject.org/author/vajda/ Seit V2.4 (2009): Unterprojekt von Apache Lucene Vormals OSF nun ASF (Open Apache Software Foundation) Aktuelle Release : PyLucene 3.4.0 (Juli 2011) / JCC-2.11 Erscheint i.d.R. in enger Zeitfolge zur Java Lucene Release Okt.2011 TKo@PyCon-DE 18
  • 19. Fragen Apache PyLucene Community mailing list: pylucene-dev@lucene.apache.org svn: http://svn.apache.org/repos/asf/lucene/pylucene/ ? Okt.2011 TKo@PyCon-DE 19
  • 20. Weitere Möglichkeiten von PyLucene Fortgeschrittene Themen: Analyzer: eigene Analyzer entwickeln Diverse Query Typen: phrase queries, wildcard queries, proximity queries, fuzzy queries z.B. für date-range searching MoreLikeThis – ähnliche Dokumente im Index Field/Documentboost, ranked searchingetc. Okt.2011 TKo@PyCon-DE 20
  • 21. Verwandte Projekte Projekte die PyLucene verwenden Chandler: open source note-to-self organizer designed for personal use and small group collaboration. http://chandlerproject.org Siehe auch http://chandlerproject.org/PyLucene/ProjectsUsingPyLucene Projekte die auf PyLucene aufbauen lupyne : a pythonicsearchengine, based on PyLucene andCherryPy http://code.google.com/p/lupyne (active) Plush: PlushisPyLUceneSHelltoplaywith Lucene indexesinteractively http://pypi.python.org/pypi/plush(2007 /PyLucene 2.0 !) Okt.2011 TKo@PyCon-DE 21