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


Top Related