Praktische Umsetzung der Facettensuche
Vortrag auf der Froscon 2013
http://programm.froscon.org/2013/events/1206.html
Die Facettensuche ist inzwischen zu einem wichtigen Hilfsmittel für die benutzerfreundliche Erschließung von großen Datenmengen geworden. Doch wie kann man eine Facettensuche realisieren und worauf ist dabei zu achten? Ziel des Vortrages ist es, diese Fragen zu beantworten und praktische Hinweise zu geben.
Das Apache Lucene Projekt beinhaltet mit Lucene Core - dem Java-basierten Index- und Such-Framework - und mit Solr - dem hochperformanten und konfigurierbaren Such-Server - zwei mächtige Werkzeuge, die zur Implementierung von Suchmaschinen als Open Source Software zur Verfügung stehen.
Der Vortrag wird beide Ansätze vorstellen und zeigen, wie sich damit eine Facettensuche realisieren lässt. Dabei wird sowohl die Möglichkeit der konfigurationsbasierten Facettensuche in Solr als auch die komplexere Herangehensweise über das Lucene Framework vorgestellt und beide Methoden miteinander verglichen.
Neben dem Thema der technischen Vorgehensweise werden dabei auch allgemeine Punkte der Facettensuche betrachtet, etwa Fragen zur Struktur der zu durchsuchenden Daten und der Auswahl von Facetten bis zu Hinweisen zur Darstellung an der Benutzerschnittstelle.
1. Facettensuche mit Lucene und Solr
Praktische Umsetzung der Facettensuche
Thomas Koch
@tomy_koch
FrOSCon St.Augustin
25. August 2013
Sonntag, 25. August 13
2. ü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
3. 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
5. 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
6. 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
9. 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
10. Beispiel #3
10
• Suche nach Forschungsvorhaben
• Einfache
Suchfunktion
• Einschränkung
über Facetten
• Facetten:
• Laufzeit
• Kosten
• Ort:
Bundesland /
Stadt
Sonntag, 25. August 13
13. Bausteine (1/2)
• Suchraumaufbereitung
• Erfassen der Objekte und Informationsextraktion
z.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
14. 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 interaktiveVerfeinerung der Suche unterstützen
(z.B. Facetted Search, Filter)
• Facettensuche muss hierbei besonders berücksichtigt werden
Sonntag, 25. August 13
15. 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
16. 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
18. Apache Lucene
• Lucene Core
• Java-basiertes Framework für Indexing
und Suche
• bietet API zur Entwicklung von
Suchkomponenten
• basiert auf invertiertem Index
(und effizienterVerwaltung desselben...)
Sonntag, 25. August 13
19. 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 JavaVM zur Laufzeit
Sonntag, 25. August 13
20. 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
21. Aufbau von Lucene
• Anwendung
(eigener Code)
• Lucene
(Framework)
• Storage
(File, RAM, DB,…)
Index
IndexWriter IndexSearcher
Sonntag, 25. August 13
22. 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. 23
Solr Indexing
XML Update
Handler
CSV Update
Handler
/update /update/csv
XML Update
with custom
processor
chain
/update/xml
Solr CELL:
Extracting
RequestHandler
(PDF, Word, …)
via Apache Tika
/update/extract
Lucene Index
Data Import
Handler
Database pull
RSS pull
Simple
transforms
SQL DB
RSS
feed
<doc>
<title>
Signature
processor
Logging
processor
Index
processor
Custom Transform
processor
PDF
HTTP POST
HTTP POST
pull
pull
Update Processor Chain (per handler)
Lucene
Text Index
Analyzers
Sonntag, 25. August 13
24. 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
25. 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
26. 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
32. 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
33. 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
35. 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
38. 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
39. 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
40. 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
41. Beispiel:
Facetten hinzufügen
FacetFields facetFields = new FacetFields(taxoWriter);
Document doc = Document();
// add the needed fields to the document to be indexed
doc.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 taxonomy
List<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
42. 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
43. Weitere Infos
• Solr Buch (veraltet: SolrVersion 3.x)
• www.solrenterprisesearchserver.com
• Solr Wiki (aktuell: SolrVersion 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
44. 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
45. 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 Results
https://developers.google.com/custom-search/images/start_google_wheels_result.png
Sonntag, 25. August 13
46. Kontakt / Fragen
• Thomas Koch: @tomy_koch
• Quellcode der Beispiele:
• Lucene: http://goo.gl/H3Uo23
• Solr: http://goo.gl/QyoHbG
• PyCon.DE 2013
http://2013.de.pycon.org
• PyCologne:
http://wiki.python-forum.de/pycologne
• EnArgus-Projekt
http://www.enargus.de
Sonntag, 25. August 13