facettensuche mit lucene und solr

46
Facettensuche mit Lucene und Solr Praktische Umsetzung der Facettensuche Thomas Koch @tomy_koch FrOSCon St.Augustin 25. August 2013 Sonntag, 25. August 13

Upload: thomas-koch

Post on 27-Jun-2015

2.957 views

Category:

Technology


3 download

DESCRIPTION

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.

TRANSCRIPT

Page 1: Facettensuche mit Lucene und Solr

Facettensuche mit Lucene und SolrPraktische Umsetzung der Facettensuche

Thomas Koch @tomy_koch

FrOSCon St.Augustin 25. August 2013

Sonntag, 25. August 13

Page 2: Facettensuche mit Lucene und Solr

ü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

Page 3: Facettensuche mit Lucene und Solr

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

Page 4: Facettensuche mit Lucene und Solr

FACETTENSUCHEKurzeinführung

4

Sonntag, 25. August 13

Page 5: Facettensuche mit Lucene und Solr

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

Page 6: Facettensuche mit Lucene und Solr

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

Page 7: Facettensuche mit Lucene und Solr

Beispiel #1• Online-Shops: Amazon, Ebay, …–Facetten: Preis, Hersteller, Typ etc.

Sonntag, 25. August 13

Page 8: Facettensuche mit Lucene und Solr

Beispiel #2• Seek–facetted email browsing

(seek: Erweiterung für Mozilla Thunderbird)

Sonntag, 25. August 13

Page 9: Facettensuche mit Lucene und Solr

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

Page 10: Facettensuche mit Lucene und Solr

Beispiel #3

10

• Suche nach Forschungsvorhaben • Einfache

Suchfunktion• Einschränkung

über Facetten• Facetten:

• Laufzeit• Kosten• Ort:

Bundesland / Stadt

Sonntag, 25. August 13

Page 11: Facettensuche mit Lucene und Solr

GRUNDLEGENDE KONZEPTE

Theorie

Sonntag, 25. August 13

Page 12: Facettensuche mit Lucene und Solr

Bausteine der Suche

• Suchraumaufbereitung

•Textanalyse

• Indexierung

• Suche

•Trefferanzeige

Sonntag, 25. August 13

Page 13: Facettensuche mit Lucene und Solr

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

Page 14: Facettensuche mit Lucene und Solr

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

Page 15: Facettensuche mit Lucene und Solr

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

Page 16: Facettensuche mit Lucene und Solr

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

Page 17: Facettensuche mit Lucene und Solr

LUCENE & SOLRSoftware

Sonntag, 25. August 13

Page 18: Facettensuche mit Lucene und Solr

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

Page 19: Facettensuche mit Lucene und Solr

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

Page 20: Facettensuche mit Lucene und Solr

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

Page 21: Facettensuche mit Lucene und Solr

Aufbau von Lucene• Anwendung

(eigener Code)

• Lucene(Framework)

• Storage(File, RAM, DB,…)

Index

IndexWriter IndexSearcher

Sonntag, 25. August 13

Page 22: Facettensuche mit Lucene und Solr

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

Page 23: Facettensuche mit Lucene und Solr

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

PDF

HTTP POSTHTTP POST

pull

pull

Update Processor Chain (per handler)

Lucene

Text Index Analyzers

Sonntag, 25. August 13

Page 24: Facettensuche mit Lucene und Solr

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

Page 25: Facettensuche mit Lucene und Solr

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

Page 26: Facettensuche mit Lucene und Solr

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

Page 27: Facettensuche mit Lucene und Solr

TECHNISCHE DETAILS& BEISPIELE

Praxis

Sonntag, 25. August 13

Page 28: Facettensuche mit Lucene und Solr

Facettenin Solr

Sonntag, 25. August 13

Page 29: Facettensuche mit Lucene und Solr

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

Page 30: Facettensuche mit Lucene und Solr

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

Page 31: Facettensuche mit Lucene und Solr

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

Page 32: Facettensuche mit Lucene und Solr

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

Page 33: Facettensuche mit Lucene und Solr

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

Page 34: Facettensuche mit Lucene und Solr

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

Page 35: Facettensuche mit Lucene und Solr

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

Page 36: Facettensuche mit Lucene und Solr

Facetten in Lucene

Sonntag, 25. August 13

Page 37: Facettensuche mit Lucene und Solr

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

Page 38: Facettensuche mit Lucene und Solr

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

Page 39: Facettensuche mit Lucene und Solr

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

Page 40: Facettensuche mit Lucene und Solr

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

Page 41: Facettensuche mit Lucene und Solr

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

Page 42: Facettensuche mit Lucene und Solr

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

Page 43: Facettensuche mit Lucene und Solr

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

Page 44: Facettensuche mit Lucene und Solr

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

Page 45: Facettensuche mit Lucene und Solr

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

Page 46: Facettensuche mit Lucene und Solr

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