Facettensuche mit Lucene und Solr Praktische Umsetzung der Facettensuche Thomas Koch @tomy_koch FrOSCon St.Augustin 25. August 2013 Sonntag, 25. August 13
Jun 27, 2015
Facettensuche mit Lucene und SolrPraktische Umsetzung der Facettensuche
Thomas Koch @tomy_koch
FrOSCon St.Augustin 25. August 2013
Sonntag, 25. August 13
über mich• Thomas Koch
• Generation 40+
• Software-Entwickler
• Python, JavaScript, Java ...
• Python User Group PyCologne
• PyCon.DE 2013 (Oktober, Köln)
• OrbiTeam Software (Bonn)
• BSCW (Collaboration Server)
Sonntag, 25. August 13
Agenda
• Facettensuche
• Kurzeinstieg, Motivation, Beispiele
• Grundlegende IR-Konzepte
• Index, Hits, Document, Fields
• Überblick Lucene & Solr
• Features, Gemeinsamkeiten und Unterschiede
• Technische Details und Beispiele
• Facettensuche in Solr
• Facettensuche in Lucene
• Verwandte Projekte und Informationsquellen
Sonntag, 25. August 13
FACETTENSUCHEKurzeinführung
4
Sonntag, 25. August 13
Facettensuche:Einführung• Facette: Eigenschaft von Objekten (des Suchraums)
• z.B. Preis, Farbe, Hersteller, Kategorie
• erlaubt Einschränkung der Suchergebnisse
• Facettensuche: ausgehend von einer einfachen Suchanfrage werden die angezeigten Suchergebnisse durch das Filtern nach bestimmten Kriterien (Facetten) fortlaufend eingegrenzt
• auch bekannt als: guided navigation, faceted navigation,faceted browsing, explorative Suche
Sonntag, 25. August 13
Facettensuche - Motivation
• Ziel: benutzerfreundliche, effiziente Erschließung von großen Datenmengen
• benutzerfreundlich: Anwender kann Facetten in beliebiger Reihenfolge auswählen (und entfernen)
• effizient: Kombination von Facetten wirkt wie Filter: UND-Verknüpfung
Sonntag, 25. August 13
Beispiel #1• Online-Shops: Amazon, Ebay, …–Facetten: Preis, Hersteller, Typ etc.
Sonntag, 25. August 13
Beispiel #2• Seek–facetted email browsing
(seek: Erweiterung für Mozilla Thunderbird)
Sonntag, 25. August 13
Aspekte der Facettensuche an der Benutzerschnittstelle
• Darstellung der Facetten– oben oder seitlich (links) anordnen– alle Facetten anzeigen, die im Kontext sinnvoll/
verfügbar sind– Facette sollte die Anzahl der erwarteten Treffer
(bei Auswahl) anzeigen
• Auswahl anwenden (=Suche verfeinern)– direkt bei der Auswahl einer Facette– oder nach Bestätigung durch Anwender
9
Sonntag, 25. August 13
Beispiel #3
10
• Suche nach Forschungsvorhaben • Einfache
Suchfunktion• Einschränkung
über Facetten• Facetten:
• Laufzeit• Kosten• Ort:
Bundesland / Stadt
Sonntag, 25. August 13
GRUNDLEGENDE KONZEPTE
Theorie
Sonntag, 25. August 13
Bausteine der Suche
• Suchraumaufbereitung
•Textanalyse
• Indexierung
• Suche
•Trefferanzeige
Sonntag, 25. August 13
Bausteine (1/2)
• Suchraumaufbereitung
• Erfassen der Objekte und Informationsextraktionz.B. Extraktion der Daten (Web-Crawler, DB-Export)
• Textanalyse
• Vorverarbeitung der Ausgangsdaten (Texte) in ,Wörter‘ (Terme)
• Normalisierung mittels Stemmer, Tokenizer, Filter etc.
• Indexierung
• Textaufbereitung und -erfassung im Suchindex
• Aktualisierung und Optimierung der Index-Strukturen
Sonntag, 25. August 13
Bausteine (2/2)
• Suche
• Erfolgt mittels einer Abfragesprache (Query Language)
• Verknüpfung von Suchausdrücken per boolscher Logik
• Liefert Treffer (Hits) und deren Ranking (Scores)
• Trefferanzeige
• Letzter Schritt: Visualisierung der Suchergebnisse (Anwendungsabhängig)
• Kann interaktive Verfeinerung der Suche unterstützen(z.B. Facetted Search, Filter)
• Facettensuche muss hierbei besonders berücksichtigt werden
Sonntag, 25. August 13
Index, Document, Field• Index: verwaltet Dokumente (,Document‘)
• Inhalte werden im (invertierten) Index verwaltet (optimiert für Suchanfragen)
• Document: repräsentiert Objekt
• z.B. Webseite, E-mail, PDF-Dokument, Wikipedia-Artikel etc. ...
• Field: Attribute eines Dokuments
• Metadaten bzw. Felder (,Fields‘)
• grob: key-value pair
• Facetten arbeiten auf Feldern
Sonntag, 25. August 13
Index-Struktur (in memory / Objekt-Modell)
• Inhalte, die durchsucht werden sollen, müssen in Dokumente & Felder (Documents & Fields) transformiert werden => Denormalisierung
• Beispiele für Felder (Field): – Autor, Content,
Änderungsdatum, Titel, Abstract, Keywords etc.
• Suche:
– Anfrage über Felder und Werte (sog. „Terme“)
– liefert passende Dokumente
Dokument
….Feld
…Term Term
Feld…Term Term
Dokument….
Index
Sonntag, 25. August 13
LUCENE & SOLRSoftware
Sonntag, 25. August 13
Apache Lucene
• Lucene Core
• Java-basiertes Framework für Indexing und Suche
• bietet API zur Entwicklung von Suchkomponenten
• basiert auf invertiertem Index (und effizienter Verwaltung desselben...)
Sonntag, 25. August 13
Apache PyLucene• Java Lucene
• Ist cross platform: 100%-pure Java
• PyLucene
• Python Portierung von Lucene Core (über JCC)
• API-kompatibel und Index-kompatibel
• Python Module aus PyLucene werden (via JCC) direkt aus den Lucene Core Java-Sourcen erzeugt
• PyLucene Code benötigt eine Java VM zur Laufzeit
Sonntag, 25. August 13
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)
• Facetted Search
Sonntag, 25. August 13
Aufbau von Lucene• Anwendung
(eigener Code)
• Lucene(Framework)
• Storage(File, RAM, DB,…)
Index
IndexWriter IndexSearcher
Sonntag, 25. August 13
Apache Solr• Solr = Such-Server auf Basis von Lucene
Core mit REST-like API.• Solr basiert auf der Lucene Search Library
• 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 JSON
Sonntag, 25. August 13
23
Solr Indexing
XML Update Handler
CSV Update Handler
/update /update/csvXML Update with custom processor
chain
/update/xml
Solr CELL: Extracting
RequestHandler(PDF, Word, …)
via Apache Tika
/update/extract
Lucene Index
Data ImportHandler
Database pullRSS pullSimple
transformsSQL DB
RSS feed
<doc> <title>
Signatureprocessor
Loggingprocessor
Indexprocessor
Custom Transformprocessor
HTTP POSTHTTP POST
pull
pull
Update Processor Chain (per handler)
Lucene
Text Index Analyzers
Sonntag, 25. August 13
Solr Features• Alle Lucene Features sowie ...
• Caching, Faceted Search und Filter• Extraktion von Inhalt und Metadaten (via Apache Tika)• Alternative Query Parser (dismax, edismax) • Geo-Suche (Distanz)• Data Schema (Numeric Types, Dynamic Fields, Unique Keys…)• Diverse Client APIs für Java, Unix(shell-script), Python etc.
• Solr ist flexibel • hochgradig anpassbar (XML-Konfigurationsdateien)• ... und erweiterbar (Lucene/Solr plugins)• ... und performant (unterstützt verteilte Indexes)
Sonntag, 25. August 13
Gemeinsamkeiten
• Lucene & Solr sind...
• Open Source (Apache 2.0 Lizenz)
• in Java entwickelt
• gut dokumentiert
• flexibel erweiterbar
• stabil und leistungsfähig
Sonntag, 25. August 13
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, 25. August 13
TECHNISCHE DETAILS& BEISPIELE
Praxis
Sonntag, 25. August 13
Facettenin Solr
Sonntag, 25. August 13
Solr: Getting started
• Download, Configure & Run
• Etliche XML-Konfigurationsdateien in conf
• solrconfig.xml
• schema.xml
• Start Server $ java -jar start.jar
• Solr4 benötigt Java 1.6
• Open Browser: http://localhost:8983/solr/
Sonntag, 25. August 13
Solr Konfiguration• solrconfig.xml
• Allgemeine Konfiguration (Data Directory ...)
• Index Konfiguration (Lucene Parameter ...)
• Diverse Handler: requestHandler, DataImportHandler, queryResponseWriter...
• schema.xml
• Schema-Definition <schema> <types> <fields> <uniqueKey> <defaultSearchField> <solrQueryParser defaultOperator> <copyField> </schema>
Sonntag, 25. August 13
Facetten Konfiguration
• Erfolgt in solrconfig.xml
• einzelne Felder als Facet definieren
• Facetten-Typen wählbar (z.B. Rangefacet)<str name="facet.field">author</str><str name="facet.mincount">1</str>
<str name="facet.range">price</str><int name="f.price.facet.range.start">0</int><int name="f.price.facet.range.end">600</int><int name="f.price.facet.range.gap">50</int>
Sonntag, 25. August 13
Solr Anwendung
• Daten "importieren" (=indexieren)
• via Kommandozeile und XML-Datei (UTF-8 encoding beachten!)
• via curl und CSV-Datei
• via DIH – Data Import Handler
• import aus Datenbank (via JDBC)
• import aus Web-Server (via HTTP GET)
• etc. (files, IMAP, xslt, ...)
$ curl http://localhost:8983/solr/update/csv -F commit=true -F stream.file=/tmp/data.csv
$ java -Ddata=files -jar post.jar data*.xml
Sonntag, 25. August 13
Solr Suche• Suche via http-Request
• z.B. http://localhost:8983/solr/select?q=demo
• liefert XML-Darstellung der Ergebnisse (wahlweise auch JSON, Python oder CSV)
Sonntag, 25. August 13
Solr Facettensuche
• Facetten als Query Parameter
• Tipp: rows=0 liefert nur Facetten-Ergebnisse
http://localhost:8983/solr/select?q=a_name:abba &facet=true&facet.field=a_type&rows=0
<response><lst name="responseHeader"> <int name="status">0</int> <int name="QTime">3</int></lst><result name="response" numFound="20" start="0"/><lst name="facet_counts"> <lst name="facet_queries"/> <lst name="facet_fields"> <lst name="a_type"> <int name="person">6</int> <int name="group">3</int> </lst> </lst> </lst></lst></response>
Sonntag, 25. August 13
Solr: Beispiel• Datenquelle: http://musicbrainz.org
• Daten: Solr-Instanz mit Tracks und Artists(Beispiel aus Solr Buch ‘Solr Enterprise Search‘)
• Demos
• Solr Admin-GUI und Demo-GUI
• Beispiel-GUI
• ist anpassbar (via velocity templating)
• bietet bereits Facetten, highlighting, auto complete etc.
• Script zur Suche in Solr
• mittels Python client für Solr: SolrPy
http://localhost:8983/solr/browse
Sonntag, 25. August 13
Facetten in Lucene
Sonntag, 25. August 13
Lucene in der Praxis• Suchraumaufbereitung
• Anwendungssache!
• Textanalyse
• Klassen: StandardAnalyzer, SnowballFilter, PorterStemFilter, GermanAnalyzer
• Indexierung
• Klassen: IndexWriter, Document, Field
• Suche
• Klassen: IndexSearcher, QueryParser, Term
• Trefferanzeige
• Klassen: Hit, hit.score, Explanation
• Facetten
• Klassen: Facet, FacetCollector, ...
Sonntag, 25. August 13
Facetten in Lucene• Basis der Facetten: taxonomy of categories
• Lucene arbeitet auf Kategorien einer Taxonomie
• Taxonomie wird bei Indexierung erstellt
• ... und in eigenem Index verwaltet
• Klassen: DirectoryTaxonomyWriter und DirectoryTaxonomyReader
• Kategorien pro Dokument – category path
• Klasse: CategoryPath
• Beispiele
• year/2012 // year/2011 etc.
• Kategorien können unterschiedliche Tiefe haben
• Year/2013/August
• Location/Germany/NRW/Sankt Augustin
Sonntag, 25. August 13
Beispiel: Indexierung• Inhalte hinzufügen:
IndexWriter und Document
• Eigenschaften der Felder: Stored (yes/no), Analyzed (yes/no)
•
store = lucene.SimpleFSDirectory(lucene.File(storeDir)) analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)writer = lucene.IndexWriter(store, analyzer, True, #create lucene.IndexWriter.MaxFieldLength.LIMITED)
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 document
Sonntag, 25. August 13
Hilfsklassen für Suche und Indexierung
• Indexierung: FacetFields
• Erfassung von Kategorien zu einem Dokument (bei der Indexierung)
• arbeitet auf Liste von Kategorien
• Suche: FacetRequest
• eine Suchanfrage (Query) kann Facetten enthalten
• Details in FacetSearchParams spezifiziert (...)
• Suche: FacetsCollector
• ... unterstützt die Facettensuche, liefert (top-level) Kategorien einer Anfrage
• Suchergebnisse beinhalten Treffer (hits) und Facetten ("category roots")
• Der FacetsCollector liefert einen FacetResult pro FacetRequest
• FacetRequest erlaubt facets aggregation
Sonntag, 25. August 13
Beispiel: Facetten hinzufügen
FacetFields facetFields = new FacetFields(taxoWriter); Document doc = Document();
// add the needed fields to the document to be indexeddoc.add(new Field("isbn", "123-ABC ", Field.Store.YES, Field.Index.NOT_ANALYZED));doc.add(new Field("name", "Lucene in Action", Field.Store.YES, Field.Index.ANALYZED));
// add the categories to the taxonomyList<CategoryPath> facetList = new ArrayList<CategoryPath>();facetList.add(new CategoryPath("Author", "Erik Hatcher"));facetList.add(new CategoryPath("Author", "Otis Gospodnetić"));facetList.add(new CategoryPath("Published", "2004", "December"));// add the categories to the taxonomy facetFields.addFields(doc, facetList);indexWriter.addDocument(doc);
Sonntag, 25. August 13
PyLucene Demo• Eine einfache Suchmaschine für Musik-Alben
• Datenquelle: http://musicbrainz.org
• Vorgehen:
• Script für Index-Erstellung (aus CSV)
• Python 2.7 und PyLucene 4.4 : IndexReleases.py
• ca. 120 lines of code
• Script zur Suche über Index
• Kommandozeile: $ python SearchReleases.py
• Anzeige von Suchergebnissen und Facetten
Sonntag, 25. August 13
Weitere Infos• Solr Buch (veraltet: Solr Version 3.x)
• www.solrenterprisesearchserver.com
• Solr Wiki (aktuell: Solr Version 4.4)
• z.B. Details zu Faceted Search in Solr: SolrFacetingOverview
• Lucene Buch (2te Auflage)
• http://www.manning.com/hatcher2/
• Lucene / PyLucene
• http://lucene.apache.org /pylucene
• PySolr – Python Client
• https://github.com/toastdriven/pysolr
Sonntag, 25. August 13
Related Work• Weitere Suchmaschinenframeworks
• Whoosh (Python)
• Xapian (C++)
• Elastiscsearch (Java) Vergleich Solr vs. Elasticsearch http://solr-vs-elasticsearch.com
• Facetted Search Implementations
• Blog-Artikel von Michael McCandless http://blog.mikemccandless.com/2012/12/fun-with-lucenes-faceted-search-module.html
• Meta-Frameworks
• z.B. Haystack (Python/Django)
• Bietet Suchfunktionalität als „Plugin“ für Web-Framework Django
• Definiert einheitliche API
• Unterstützt verschiedene „Search backends“ (z.B. Solr, Elasticsearch, Whoosh, Xapian)
Sonntag, 25. August 13
Copyrights• Markennamen
• 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, 2013.de.pycon.org
• Bücher: Packtlib, Manning
• Long and winding road: Flickr (Creative Commons) Thanks to Pierre Metivier
• Fernsehturm Berlin: Flickr (Creative Commons) Thanks to myyorgda
• Statue outside the Centre for Life in Newcastle: Flickr (Share-a-Like) Thanks to Reith Lectures
• Indy Car in Garage: Flickr (creative commons share-alike) Thanks to John P.
• Eier: http://www.lsg.musin.de/portal/Datei:Eier.jpg
• Theoriecartoon: http://kunststoffreport.de
• Google Search Resultshttps://developers.google.com/custom-search/images/start_google_wheels_result.png
Sonntag, 25. August 13
Kontakt / Fragen• Thomas Koch: @tomy_koch
• Quellcode der Beispiele:
• Lucene: http://goo.gl/H3Uo23
• Solr: http://goo.gl/QyoHbG
• PyCon.DE 2013http://2013.de.pycon.org
• PyCologne: http://wiki.python-forum.de/pycologne
• EnArgus-Projekthttp://www.enargus.de
Sonntag, 25. August 13