Volltextsuche mit Lucene und Solr

44
Apache Lucene / Solr Volltextsuche mit Open Source Tools Thomas Koch FrOSCon St.Augustin 26. August 2012 1 Sonntag, 26. August 12

description

German talk about Apache Lucene and Solr - mainly from a Python Developer's perspective.

Transcript of Volltextsuche mit Lucene und Solr

Page 1: Volltextsuche mit Lucene und Solr

Apache Lucene / SolrVolltextsuche mit Open Source Tools

Thomas KochFrOSCon St.Augustin 26. August 2012

1Sonntag, 26. August 12

Page 2: Volltextsuche mit Lucene und Solr

über mich• Thomas Koch

• Generation 40+

• Software-Entwickler

• Python, JavaScript, Java ...

• Python User Group PyCologne

• OrbiTeam Software

• Bonn

• BSCW Collaboration Server(Python powered ,-)

2Sonntag, 26. August 12

Page 3: Volltextsuche mit Lucene und Solr

Agenda

• Überblick Lucene / Solr - was ist das?

• Grundlegende Konzepte IR

• PyLucene: Details und Beispiele

• Solr: Details und Beispiele

• Weitere Informationsquellen

3Sonntag, 26. August 12

Page 4: Volltextsuche 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...)

4Sonntag, 26. August 12

Page 5: Volltextsuche mit Lucene und Solr

Apache Solr

• Solr ist ein Such-Server auf Basis von Lucene Core (in Java)

• Out-of-the-Box: enthält alle notwendigen Komponenten und Beispiel-Konfiguration

• Easy-to-use: HTML Admin GUI und vordefiniertes Such GUI(für GUI Prototypen - sog. Solaritas)

5Sonntag, 26. August 12

Page 6: Volltextsuche 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

6Sonntag, 26. August 12

Page 7: Volltextsuche 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)

7Sonntag, 26. August 12

Page 8: Volltextsuche mit Lucene und Solr

GRUNDLEGENDE KONZEPTETheorie

8Sonntag, 26. August 12

Page 9: Volltextsuche mit Lucene und Solr

Grundlagen• Suchraumaufbereitung

• Erfassen der Objekte und Informationsextraktion

• z.B. Extraktion der Daten (Web-Crawler, DB-Export)

• ggf. Konvertierung (z.B. unterschiedliche Dokument-Formate nach Text)

• Indexierung

• Textaufbereitung und -erfassung im Suchindex - nach Suchraumaufbereitung

• beinhaltet u.a. Textanalyse (folgt)

• Bedeutet i.W. Aktualisierung und Optimierung der Index-Strukturen

• Index: Daten/Dateistrukturen für effiziente Suche (und Index-Aktualisierung)

• Wesentliche Unterschiede zu klassischen relationalen Datenbanken:kein Schema, keine Joins

9Sonntag, 26. August 12

Page 10: Volltextsuche mit Lucene und Solr

Grundlagen• Textanalyse

• Vorverarbeitung der Ausgangsdaten (Texte) in ,Wörter‘ (Terme)

• mittels Stemmer, Tokenizer, Filter etc. z.B. durch...

• Normalisierung (whitespace removal, lowercase etc.)

• Entfernung von Stop-Wörtern (he, she, it … // der, die, das…)

• Hinzufügen von Synonymen (SynonymFilter)

• Reduzierung auf Stammform - Stemming (z.B. Häuser => Haus)

• ist i.d.R. Sprachabhängig!

10Sonntag, 26. August 12

Page 11: Volltextsuche mit Lucene und Solr

Grundlagen• Suche

• mittels einer Abfragesprache (Query Language)

• Verknüpfung von Suchausdrücken per boolscher Logik (AND, OR etc.)

• basiert auf Matching-Algorithmen

• liefert Treffer (Hits) und Ranking (Scores)

• Trefferanzeige

• letzter Schritt: Visualisierung der Suchergebnisse (Anwendungsabhängig)

• kann interaktive Verfeinerung der Suche unterstützen(z.B. Facetted Search, Filter)

11Sonntag, 26. August 12

Page 12: Volltextsuche mit Lucene und Solr

Theorie & Praxis• Suchraumaufbereitung

• Ist i.d.R. Anwendungssache (und domain-spezifisch)

• Konvertierung: Apache Tika!

• Textanalyse

• StandardAnalyzer, SnowballFilter, PorterStemFilter, GermanAnalyzer

• Indexierung

• IndexWriter, Document, Field

• Suche

• IndexSearcher, QueryParser, Term

• Trefferanzeige

• Hit, hit.score, Explanation

12Sonntag, 26. August 12

Page 13: Volltextsuche mit Lucene und Solr

Index, Document, Field

• Index verwaltet Dokumente (,Document‘)(abstraktes Objekt)

• pro Dokument: verschiedene Attribute

• Metadaten bzw. Felder (,Fields‘)

• grob: key-value pair

• Inhalte werden im (invertierten) Index verwaltet

13Sonntag, 26. August 12

Page 14: Volltextsuche mit Lucene und Solr

Index-Struktur (on-disc)

• Grundlage einer index-basierten Suchmaschine: invertierter Index

14Sonntag, 26. August 12

Page 15: Volltextsuche 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 Dokumente:– E-mail, PDF-Dokument,

Wikipedia-Artikel etc.

• Beispiele für Felder (Field): – Autor, Content,

Änderungsdatum, Titel, Abstract, Keywords etc.

Dokument

….Feld

…Term Term

Feld…Term Term

Dokument….

Index

15Sonntag, 26. August 12

Page 16: Volltextsuche mit Lucene und Solr

PyLucene

16Sonntag, 26. August 12

Page 17: Volltextsuche mit Lucene und Solr

Apache PyLucene• Lucene Core

• Java-basiertes Framework für Indexing und Suche

• cross platform: 100%-pure Java

• PyLucene

• Python Portierung von Lucene Core (über JCC)

• API-kompatibel und Index-kompatibel

• JCC-Projekt: C++ code-Generator

• Anbindung von Java-Klassen/Packages an Python (über JNI)

• Python Module aus PyLucene sind durch JCC generiert (direkt aus den Lucene Core Java-Sourcen)

• Generierter Code integriert eine Java VM in den Python-Prozess

17Sonntag, 26. August 12

Page 18: Volltextsuche mit Lucene und Solr

(Py)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)

18Sonntag, 26. August 12

Page 19: Volltextsuche mit Lucene und Solr

Aufbau von PyLucene• Anwendung

(eigener Code)

• PyLucene(Framework)

• Storage(File, RAM, DB,…)

Index

IndexWriter IndexSearcher

19Sonntag, 26. August 12

Page 20: Volltextsuche mit Lucene und Solr

Lucene Details

• Anforderungen

• Lucene: Java 1.5+, Ant 1.7+

• PyLucene: Java 1.4+, Python 2.3+

• Aktuelle Version (08/2012)

• Stable: Apache (Py)Lucene 3.6.1

• Apache (Py)Lucene 4.0-ALPHA

20Sonntag, 26. August 12

Page 21: Volltextsuche mit Lucene und Solr

PYLUCENE DEMOPraxisbeispiele

21Sonntag, 26. August 12

Page 22: Volltextsuche mit Lucene und Solr

PyLucene: Erste Schritte• Getting Started: Download, Build & Run

• Download tar.gz, extract, build ...

• JCC => <Lib>/site-packages/JCC-2.14-py2.7-<platform>.egg

• Lucene => <Lib>/site-packages/lucene-3.6.1-py2.7-<platform>.egg

22Sonntag, 26. August 12

Page 23: Volltextsuche mit Lucene und Solr

PyLucene: Erste Hürden• Build erfordert: java, gcc, ant, python, setuptools

• PyLucene enthält Java Lucene Core

• Unix/MacOS: Anpassung Makefile

• Windows: MinGW/Cygwin oder MS-VC Compiler

• Runtime erfordert: java & python

• Pre-compiled binaries: PyLucene Extras Projekthttp://code.google.com/a/apache-extras.org/p/pylucene-extra/

• Hinweise zu Stolpersteinen im Wiki

23Sonntag, 26. August 12

Page 24: Volltextsuche mit Lucene und Solr

PyLucene im Interpreter

Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) [GCC 4.2.1 (Based on Apple Inc. build 5658)] Type "help", "copyright", "credits" or "license"

>>> import lucene>>> lucene.VERSION'3.6.0'>>> x = lucene.initVM()>>> x<jcc.JCCEnv object at 0x106ef8138>>>> x.java_versionu'1.6.0_33'>>> lucene.Document<type 'Document'>>>> lucene.IndexWriter<type 'IndexWriter'>

24Sonntag, 26. August 12

Page 25: Volltextsuche 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

25Sonntag, 26. August 12

Page 26: Volltextsuche mit Lucene und Solr

Beispiel: Suche

• Inhalt suchen: IndexReader und Hits

• Suchanfrage: mittel Queryparser

directory = SimpleFSDirectory(File(storeDir))searcher = IndexSearcher(directory, True) # readOnlyanalyzer = StandardAnalyzer(Version.LUCENE_CURRENT)

query = QueryParser("contents", analyzer).parse(queryStr)# perform query on index and get max=50 resultsscoreDocs = searcher.search(query, 50).scoreDocs# finally show results for scoreDoc in scoreDocs: doc = searcher.doc(scoreDoc.doc) # get Document from index print ‘match:', doc.get("path")

26Sonntag, 26. August 12

Page 27: Volltextsuche mit Lucene und Solr

PyLucene Demo• Ziel: Suchmaschine für Liedtitel

• Datenquelle: http://musicbrainz.org

• Vorgehen:

• Script für Index-Erstellung (aus CSV)

• Script zur Suche über Index

• Laufzeit:

• Index mit ca. 7 Mio. Tracks aus MusicBrainz wird in 7:34s erstellt (ca. 600 MB Index)

27Sonntag, 26. August 12

Page 28: Volltextsuche mit Lucene und Solr

Solr

28Sonntag, 26. August 12

Page 29: Volltextsuche 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

und erweitert diese• 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

29Sonntag, 26. August 12

Page 30: Volltextsuche mit Lucene und Solr

• Perfomance• Optimized for High Volume Web Traffic: highly configurable Caching• Fast Incremental Updates and Index Replication

• Highly scalable distributed search (sharded index across multiple hosts)

• Features• Faceted Search und Filter• Extraktion von Inhalt und Metadaten (via Apache Tika)• Alternative Query Parser (dismax, edismax) und Geo-Suche (Distanz)• Data Schema (Numeric Types, Dynamic Fields, Unique Keys…)

• Offen• Diverse Client APIs für Java, Unix(shell-script), Python etc.

• Flexibel • hochgradig anpassbar (XML-Konfigurationsdateien)• erweiterbar (Lucene/Solr plugins)

Solr: Features

30Sonntag, 26. August 12

Page 31: Volltextsuche mit Lucene und Solr

• Solr Server• Basiert auf Servlets (Jetty, Tomcat o.ä.)• Wird durch Konfigurationsdateien angepasst (XML)

• z.B. schema.xml , solr.xml

• Bietet „REST-like“ API• z.B. http://localhost:8983/solr/update/csv

• Erlaubt add,update,delete über HTTP-Interface• z.B. einfacher POST einer XML-Datei• andere HTTP-Schnittstellen für CSV, PDF etc.

• Kann sich auch Daten „ziehen“ (Pull)• Über RSS-Feed oder DB-Adapter

• Skaliert durch Replication (Master/Slave)

Solr: Architektur

31Sonntag, 26. August 12

Page 32: Volltextsuche mit Lucene und Solr

Lucene/Solr Architecture

32

Apache Lucene

/select /spell XML CSVXML Binary JSON

Data Import Handler (SQL/

RSS)

Extracting RequestHandler

(PDF/WORD)

CachingFaceting

Query Parsing

Apache Tika

binary/admin

High-lighting

Schema

Index Replication

Request Handlers Update HandlersResponse Writers

QuerySearch Components

SpellingFaceting

Highlighting SignatureLogging

Update Processors

Indexing

Config

DebugStatistics

More like this

Distributed Search

Clustering

Filtering Search

Core SearchIndexReader/

SearcherIndexing

IndexWriterText Analysis

Analysis

32Sonntag, 26. August 12

Page 33: Volltextsuche mit Lucene und Solr

33

Solr Indexing

8

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

33Sonntag, 26. August 12

Page 34: Volltextsuche mit Lucene und Solr

Solr Details

• Getting Started

• Anforderung: Java 1.5+

• Tutorial: http://lucene.apache.org/solr/tutorial.html

• Aktuelle Version (08/2012)

• Stable: Apache Solr 3.6.1 (ca. 90 MB)

• Apache Solr 4.0-ALPHA

34Sonntag, 26. August 12

Page 35: Volltextsuche mit Lucene und Solr

SOLR DEMOPraxisbeispiele

35Sonntag, 26. August 12

Page 36: Volltextsuche mit Lucene und Solr

Getting started• Download, Configure & Run

• Etliche XML-Konfigurationsdateien in conf

• solrconfig.xml Allgemeine Konfiguration zu Lucene, Directories, Web

• schema.xml Datenschema für Suchfelder

• Start Server $ java -jar start.jar

• Open Browser: http://localhost:8983/solr/ bzw. /solr/browse

36Sonntag, 26. August 12

Page 37: Volltextsuche mit Lucene und Solr

Solr: Adding Datajava -jar post.jar data.xml|.json|.csv

• ipod_video.xml

37Sonntag, 26. August 12

Page 38: Volltextsuche mit Lucene und Solr

• Kein integrierter Python Client• Note: As of version 1.3, Solr no longer comes bundled with a

Python client. The existing client was not sufficiently maintained or tested as development of Solr progressed, and committers felt that the code was not up to our usual high standards of release.

• Verschiedene Bindings für Solr verfügbar• solrpy: a python client for solr

http://code.google.com/p/solrpy/• Sunburnt: a python-solr interface

https://github.com/tow/sunburnt• Und mehr im Solr-Wiki …

http://wiki.apache.org/solr/SolPython

Solr & Python

38Sonntag, 26. August 12

Page 39: Volltextsuche mit Lucene und Solr

• Import und Suche via Python

• mittels eines Python clients für Solr

• Basis: SolrPy

• a lightweight Python wrapper for Apache Solr

• allows to add documents to a Solr instance

• and to perform queries and gather search results from Solr using Python.

Solr: Demo

39Sonntag, 26. August 12

Page 40: Volltextsuche mit Lucene und Solr

Solr: Beispiel

• Datenquelle: http://musicbrainz.org

• Daten: vorkonfigurierte Solr-Instanz (aus Solr Buch) mit Tracks, Artists, Releases

• Demo:

• Solr Admin GUI

• Script zur Suche über Solr

40Sonntag, 26. August 12

Page 41: Volltextsuche mit Lucene und Solr

Weitere Infos• Solr Buch

• www.solrenterprisesearchserver.com

• Lucene Buch

• http://www.manning.com/hatcher2/

• Lucene / PyLucene

• http://lucene.apache.org /pylucene

• PySolr

• https://github.com/toastdriven/pysolr

• Lucene Revolution (Konferenz)

• http://www.lucenerevolution.org

41Sonntag, 26. August 12

Page 42: Volltextsuche mit Lucene und Solr

Copyrights• 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

• Bücher: packtlib, Manning

• 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

• Foto Robert Harding (Hürden): dpa / RP online

• Lucene/Solr Architecture, Inverted Index:http://people.apache.org/~yonik/presentations

42Sonntag, 26. August 12

Page 44: Volltextsuche mit Lucene und Solr

Kontakt / Fragen

• Thomas Koch

• Twitter: @tomy_koch

• eMail: [email protected]

• PyCologne:

• http://www.pycologne.de

• Treffen: jeden 2.Mittwoch in Köln

44Sonntag, 26. August 12