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