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

1,661
-1

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
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,661
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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 />

×