Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Die Nadel im Heuhaufen – Indexbasierte Volltextsuche mit PyLucene<br />Thomas Koch<br />OrbiTeam Software, Bonn<br />koch@...
Agenda<br />Was ist PyLucene?<br />Einsatzbereiche von PyLucene<br />Wie funktioniert eine Suchmaschine?<br />Aufbau & Anw...
Was ist PyLucene?<br />PyLucene = Python + Lucene<br />Lucene: Java-Bibliothek für Suchmaschinen<br />Apache Lucene Core™ ...
Was ist PyLucene nicht?<br />PyLucene ist keine fertige Suchmaschine<br />also  ≠ ht://Dig , Swish etc.<br />aber: Bibliot...
Einsatzbereiche von {Py}Lucene<br />Desktop-Suche 	<br />Dokumente(auf HDD) erfassen (z.B. via os.walkdiro.ä.)<br />Dokume...
Wie funktioniert eine Suchmaschine?<br />Suchraumaufbereitung<br />Erfassen der Objekte und Informationsextraktion<br />In...
Wo hilft uns PyLucene?<br />Suchraumaufbereitung<br />“Lucene does not care about the Parsing of document formats” <br />...
Aufbau von PyLucene<br />Anwendung(eigener Code)<br />PyLucene(Framework)<br />Storage(File, RAM, DB,…)<br />IndexWriter<b...
Herausforderungen bei der Suche & Indexierung <br />Textanalyse<br />Aufbereitung von Texten <br />Zerlegung in Tokens (fü...
Struktur: Dokumente und Felder<br />Okt.2011<br />TKo@PyCon-DE<br />10<br />Index<br />Dokument<br />….<br />Inhalte die d...
Anwendung von PyLucene: Indexierung<br />Index anlegen<br />Inhalte zum Index hinzufügen<br />TKo@PyCon-DE<br />11<br />im...
Anwendung von PyLucene: Suche<br />Suchanfrage vorbereiten<br />Suchanfrage durchführen<br />Okt.2011<br />TKo@PyCon-DE<br...
Anwendung von PyLucene: Tipps<br />PyLucene Initialisierung <br />vor dem Aufruf von PyLucene muss JVM geladen werden<br /...
Weiterführende Themen: Werkzeuge<br />Lucene Index Viewer<br />Luke - Lucene Index Toolbox <br />Java-Anwendungmit GUI<br ...
Weiterführende Themen: Literatur<br /><ul><li>Dokumentation: Java Lucene API</li></ul>i.d.R. 1:1 auf Python übertragbar, a...
Weiterführende Themen: Solr<br />Apache Solr<br />A powerful enterprise search server built on top of Lucene.<br />Feature...
Exkurs - PyLucene: poweredby JCC<br />Java-Code in Python ‚einbetten‘<br />Jpype<br />allow python programs fullaccess to ...
Historie<br />Entwicklung von PyLucene<br />Lucene 1.0: entwickelt von Doug Cutting(2000)<br />http://cutting.wordpress.co...
Fragen<br />Apache PyLucene Community<br />mailing list: pylucene-dev@lucene.apache.org<br />svn: http://svn.apache.org/re...
Upcoming SlideShare
Loading in …5
×

PyLucene@PyCon DE 2011

2,221 views

Published on

Die Nadel im Heuhaufen - Index-basierte Volltextsuche mit PyLucene
Vortrag von Thomas Koch für Anfänger - auf der PyCon.DE 2011
http://de.pycon.org/2011/schedule/sessions/53/
Der Vortrag gibt eine Einführung in das Thema Index-basierte Suche mit Python und stellt dazu das PyLucene-Projekt vor, einer Python Erweiterung, die Zugriff auf alle Features des Java Lucene Framework ermöglicht. Aufbauend auf den grundlegenden Konzepten von PyLucene wird dargestellt, wie man auf Basis des Suchmaschinen-Frameworks effiziente Suchmechanismen in Python realisieren kann.

Published in: Technology
  • Be the first to comment

PyLucene@PyCon DE 2011

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

×