SlideShare ist ein Scribd-Unternehmen logo
1 von 70
Downloaden Sie, um offline zu lesen
Suchen und Finden mit
   Lucene und Solr
      Florian Hopf
      04.07.2012
http://techcrunch.com/2010/08/04/schmidt-data/
Suche   Go
Suche                                Go

Ergebnis 1
In Ergebnis 1 taucht der Suchbegriff auf...

Ergebnis 2
In Ergebnis 2 taucht der Suchbegriff auch auf ...

Ergebnis 3
… hier steht der Suchbegriff aus Ergebnis 3...
Suche                                Go

Ergebnis 1                                            SQL
In Ergebnis 1 taucht der Suchbegriff auf...

Ergebnis 2
In Ergebnis 2 taucht der Suchbegriff auch auf ...

Ergebnis 3
… hier steht der Suchbegriff aus Ergebnis 3...
Speaker
               *

                   name
  Talk
title      *
content    *

talkdate
                   Category
               *
                   name
mysql> select * from talk where title like "%apache%";
+----+-------------------------------------------+---------+------------+
| id | title                                     | content | talkdate   |
+----+-------------------------------------------+---------+------------+
| 1 | Apache Karaf                               | ...     | 2012-04-25 |
| 2 | Integration ganz einfach mit Apache Camel | ...      | 2012-04-04 |
+----+-------------------------------------------+---------+------------+
2 rows in set (0.00 sec)
mysql> select * from talk t join talk_category tc join category c where t.id =
tc.talk and tc.category = c.id and (c.name like '%OSGi%' or t.title like
'%OSGi%' or t.content like '%OSGi%');
+----+-------------------------------------------+---------+------------
+------+----------+----+------+
| id | title           | content | talkdate   | talk | category | id | name |
+----+-------------------------------------------+---------+------------
+------+----------+----+------+
| 1 | Apache Karaf     | ...     | 2012-04-25 |    1 |        1 | 1 | OSGi |
| 2 | Integration ... | ...      | 2012-04-04 |    2 |        1 | 1 | OSGi |
+----+-------------------------------------------+---------+------------
+------+----------+----+------+
2 rows in set (0.00 sec)
●   Performance?
●   Ranking?
●   False Positives
●   Ähnlichkeitssuche (Meyer <=> Meier)
●   Flexibilität?
●   Wartbarkeit?
Suche                                Go

Ergebnis 1
In Ergebnis 1 taucht der Suchbegriff auf...

Ergebnis 2
In Ergebnis 2 taucht der Suchbegriff auch auf ...

Ergebnis 3
… hier steht der Suchbegriff aus Ergebnis 3...
File directory = new File(dir);
File[] textFiles = directory.listFiles(new TextFiles());

for (File probableMatch : textFiles) {
   String text = readText(probableMatch);
   if (text.matches(".*" + Pattern.quote(term) + ".*")) {
       filesWithMatches.add(probableMatch.getAbsolutePath());
   }
}
●   Skalierbarkeit?
●   Unterschiedliche Formate?
●   Ranking?
●   Kombination mit Datenbank?
SQL
            Suche                                Go

Ergebnis 1
In Ergebnis 1 taucht der Suchbegriff auf...

Ergebnis 2
In Ergebnis 2 taucht der Suchbegriff auch auf ...

Ergebnis 3
… hier steht der Suchbegriff aus Ergebnis 3...
Dokument 1

  Die Stadt
liegt in den
  Bergen.




Dokument 2

Vom Berg
kann man
die Stadt
   sehen.
Dokument 1
                                 Die      1
  Die Stadt    1. Tokenization   Stadt    1,2
liegt in den                     liegt    1
  Bergen.
                                 in       1
                                 den      1
                                 Bergen   1
                                 Vom      2
Dokument 2
                                 Berg     2
Vom Berg                         kann     2
kann man
die Stadt                        man      2
   sehen.                        die      2
                                 sehen    2
Dokument 1                       die      1,2
  Die Stadt    1. Tokenization   stadt    1,2
liegt in den                     liegt    1
  Bergen.
                                 in       1
               2. Lowercasing    den      1
                                 bergen   1
Dokument 2                       vom      2

Vom Berg                         berg     2
kann man                         kann     2
die Stadt
   sehen.                        man      2
                                 sehen    2
Dokument 1                       die     1,2
  Die Stadt    1. Tokenization   stadt   1,2
liegt in den
  Bergen.                        liegt   1
                                 in      1
               2. Lowercasing
                                 den     1
                                 berg    1,2
Dokument 2
               3. Stemming       vom     2
Vom Berg
kann man                         kann    2
die Stadt                        man     2
   sehen.
                                 seh     2
●   Java-Bibliothek
●   Invertierter Index
●   Analyzer
●   Query-Syntax
●   Relevanz-Algorithmus
●   KEIN Crawler
●   KEIN Document-Extractor
Quelle: http://www.ibm.com/developerworks/java/library/os-apache-lucenesearch/
●   Indexieren:
    ●   Erstellen eines Documents
    ●   Festlegen des Analyzers
    ●   Indexieren über IndexWriter
●   Suchen:
    ●   Verwendung des selben Analyzers
    ●   Parsen der Query mit QueryParser
    ●   Auslesen über IndexSearcher/IndexReader
    ●   Ausgabe über Document
Document
  Field title
      title     Integration1
                    Name ganz einfach mit Apache Camel
                               Value      Value 1


  Field date
      title        Name 1     20120404
                               Value     Value 1


  Field title
     speaker
      title     Integration1Christian Schneider
                    Name ganz einfach mit Apache Camel
                                  Value      Value 1




Document
  Field title
      title     Integration1 Apache KarafApache Camel
                    Name ganz einfach mit Value 1
                               Value


  Field date
      title        Name 1     20120425
                               Value     Value 1


  Field title
     speaker
      title     Integration1Christian Schneider
                    Name ganz einfach mit Apache Camel
                                  Value      Value 1


  Field title
     speaker
      title     Integration1 Achim Nierbeck
                    Name ganz einfach mit Apache Camel
                                 Value     Value 1
●   Index
    ●   ANALYZED
    ●   NOT_ANALYZED
    ●   NO
●   Store
    ●   YES/NO
●   Feldtyp
    ●   String, Numeric, Boolean
Analyzer


Tokenizer


TokenFilter


TokenFilter


TokenFilter


TokenFilter
Analyzer             Analyzer


Tokenizer        StandardTokenizer


TokenFilter        StandardFilter


TokenFilter        LowercaseFilter


TokenFilter   GermanNormalizationFilter


TokenFilter    GermanLightStemFilter
Document   IndexWriter




                         Directory
            Analyzer
DEMO
Document           IndexWriter




                                                Directory
QueryParser          Analyzer




  Query       IndexSearcher       IndexReader
●   TermQuery
    ●   Apache
    ●   title:Apache
●   Boolean Query
    ●   Apache AND Karaf
●   PhraseQuery
    ●   "Apache Karaf"
●   WildcardQuery
    ●   Integ*
    ●   Te?t
●   RangeQuery
    ●   date:[20120705 TO 20121231]
●   FuzzyQuery
    ●   Schneyder~
title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430]
title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430]




                           BooleanQuery
                               AND




        TermQuery           FuzzyQuery         RangeQuery
        title:apach      speaker:schneyder       date:[...]
title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430]




                           BooleanQuery
                               AND




        TermQuery           FuzzyQuery         RangeQuery
        title:apach      speaker:schneyder       date:[...]
●   FilterQueries
    ●   Ausschlusskriterium, kann gecacht werden
●   Sortierung
●   Boosting
    ●   Indexing-Time
    ●   Query-Time
score(q , d )=coord (q , d )∗queryNorm (q )∗∑ (tf (t , d )∗idf (t)2∗t.boost∗norm (t , d ))
                                              t ∈q
Anzahl der                  Invers zu Anzahl                         Feldlänge,
       Matches im                   Dokumente, die                            Index-
       Dokument                   den Term enthalten                          Boost




score(q , d )=coord (q , d )∗queryNorm (q )∗∑ (tf (t , d )∗idf (t)2∗t.boost∗norm (t , d ))
                                              t ∈q




                                           Anzahl Term                     Query-
                                           im Dokument                     Boost
DEMO
●   Parser API
●   Zahlreiche Formate
●   Integriert OpenSource-Libs
●   Betrieb embedded oder über Server
DEMO
●   Enterprise Search Server
●   Basiert auf Lucene
●   HTTP API
●   Index-Schema
●   Integriert häufig verwendete Lucene-Module
●   Facettierung
●   Dismax Query Parser
●   Admin-Interface
Webapp                                          Webapp
         XML, JSON, JavaBin, Ruby, ...




Client              http                 Solr            Lucene
Solr Home




             conf                data



               solr-
schema.xml                      Lucene
             config.xml
schema.xml



      Field Types




         Fields
Search        Index      Index      Start
                                    Indexing




             Update                            DB
                         Solr                  URL
             Request                 DIH
                         Cell                  Files
             Handler
  Search
  Handler

            Caches

                                 Replication
  Search
  Comp.     Lucene



            Monitoring
solrconfig.xml


      Lucene Config
         Caches



     Request Handler




   Search Components
Webapp                                          Webapp
         XML, JSON, JavaBin, Ruby, ...




Client              http                 Solr            Lucene
DEMO
Index



          Master



          Replicate



Slave                       Slave




        Loadbalancer




           Search
●   Geospatial Search
●   More like this
●   Spellchecker
●   Suggester
●   Result Grouping
●   Function Queries
●   Sharding
●   Suchserver basierend auf Apache Lucene
●   RESTful API
●   Dokumentenorientiert (JSON)
●   Schemafrei
●   Distributed Search
●   Near Realtime Search
●   No Commits (Transaction Log)
curl -XPOST 'http://localhost:9200/jugka/talk/' -d '{
    "speaker" : "Florian Hopf",
    "date" : "2012-07-04T19:30:00",
    "title" : "Suchen und Finden mit Lucene und Solr"}'

{"ok":true,"_index":"jugka","_type":"talk",
"_id":"CeltdivQRGSvLY_dBZv1jw","_version":1}
curl -XGET 'http://localhost:9200/jugka/talk/_search?q=solr'
{"took":29,"timed_out":false,"_shards":
{"total":5,"successful":5,"failed":0},"hits":
{"total":1,"max_score":0.054244425,"hits":
[{"_index":"jugka","_type":"talk","_id":"CeltdivQRGSvLY_dBZv1jw"
,"_score":0.054244425, "_source" : {
    "speaker" : "Florian Hopf",
    "date" : "2012-07-04T19:30:00",
    "title" : "Suchen und Finden mit Lucene und Solr"}
●   http://lucene.apache.org
●   http://tika.apache.org
●   http://lucene.apache.org/solr/
●   http://elasticsearch.org
●   http://github.com/fhopf/lucene-solr-talk
http://nlp.stanford.edu/IR-book/
Vielen Dank!


http://www.florian-hopf.de
         @fhopf

Weitere ähnliche Inhalte

Andere mochten auch

Elternanlass OS 2012
Elternanlass OS 2012Elternanlass OS 2012
Elternanlass OS 2012c_kr
 
Dr. Burkhard Bastuck: Der Intendantenvertrag
Dr. Burkhard Bastuck: Der IntendantenvertragDr. Burkhard Bastuck: Der Intendantenvertrag
Dr. Burkhard Bastuck: Der IntendantenvertragRaabe Verlag
 
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...Raabe Verlag
 
Oelkers: Das Allgemeine Gleichbehandlungssgesetz
Oelkers: Das Allgemeine GleichbehandlungssgesetzOelkers: Das Allgemeine Gleichbehandlungssgesetz
Oelkers: Das Allgemeine GleichbehandlungssgesetzRaabe Verlag
 
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...Raabe Verlag
 
Der Service für Studenten!
Der Service für Studenten! Der Service für Studenten!
Der Service für Studenten! StartLiteratur
 
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...Raabe Verlag
 
Sponsoring und werbeanfragen management tool 2013
Sponsoring  und werbeanfragen management tool 2013Sponsoring  und werbeanfragen management tool 2013
Sponsoring und werbeanfragen management tool 2013CCIMediaSwitzerland
 
Gratis Studienbroschüre Master of Arts
Gratis Studienbroschüre Master of ArtsGratis Studienbroschüre Master of Arts
Gratis Studienbroschüre Master of ArtsIUBH-Fernstudium
 

Andere mochten auch (14)

Carl Orff
Carl OrffCarl Orff
Carl Orff
 
Elternanlass OS 2012
Elternanlass OS 2012Elternanlass OS 2012
Elternanlass OS 2012
 
Tarifbedingungen - private Haftpflichtversicherung BARMENIA
Tarifbedingungen - private Haftpflichtversicherung BARMENIATarifbedingungen - private Haftpflichtversicherung BARMENIA
Tarifbedingungen - private Haftpflichtversicherung BARMENIA
 
Dr. Burkhard Bastuck: Der Intendantenvertrag
Dr. Burkhard Bastuck: Der IntendantenvertragDr. Burkhard Bastuck: Der Intendantenvertrag
Dr. Burkhard Bastuck: Der Intendantenvertrag
 
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...
Röckrath: Leitfaden für die Befristung von Arbeitsverträgen anhand von Fallbe...
 
Oelkers: Das Allgemeine Gleichbehandlungssgesetz
Oelkers: Das Allgemeine GleichbehandlungssgesetzOelkers: Das Allgemeine Gleichbehandlungssgesetz
Oelkers: Das Allgemeine Gleichbehandlungssgesetz
 
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...
Nordhausen: Künstlersozialversicherung – was ist das eigentlich? Teil I: Entw...
 
Der Service für Studenten!
Der Service für Studenten! Der Service für Studenten!
Der Service für Studenten!
 
Xriz
XrizXriz
Xriz
 
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...
Prof. Dr. Andrea Hausmann: Erfolgreiches Innovationsmanagement in Kulturbetri...
 
Sponsoring und werbeanfragen management tool 2013
Sponsoring  und werbeanfragen management tool 2013Sponsoring  und werbeanfragen management tool 2013
Sponsoring und werbeanfragen management tool 2013
 
Niccolo Paganini
Niccolo Paganini Niccolo Paganini
Niccolo Paganini
 
PDR Images LH
PDR Images LHPDR Images LH
PDR Images LH
 
Gratis Studienbroschüre Master of Arts
Gratis Studienbroschüre Master of ArtsGratis Studienbroschüre Master of Arts
Gratis Studienbroschüre Master of Arts
 

Ähnlich wie Lucene Solr talk at Java User Group Karlsruhe

Dokumenten Clustering
Dokumenten ClusteringDokumenten Clustering
Dokumenten ClusteringRamon Wartala
 
OOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDBOOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDBTobias Trelle
 
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesBack to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesMongoDB
 
Architecture and implementation of Apache Lucene
Architecture and implementation of Apache LuceneArchitecture and implementation of Apache Lucene
Architecture and implementation of Apache LuceneJosiane Gamgo
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Dokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machenDokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machenSebastian Hempel
 

Ähnlich wie Lucene Solr talk at Java User Group Karlsruhe (7)

Dokumenten Clustering
Dokumenten ClusteringDokumenten Clustering
Dokumenten Clustering
 
OOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDBOOP 2013: Praktische Einführung in MongoDB
OOP 2013: Praktische Einführung in MongoDB
 
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesBack to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
 
Architecture and implementation of Apache Lucene
Architecture and implementation of Apache LuceneArchitecture and implementation of Apache Lucene
Architecture and implementation of Apache Lucene
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Dokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machenDokumentation schreiben kann spass machen
Dokumentation schreiben kann spass machen
 
Spark vs. PL/SQL
Spark vs. PL/SQLSpark vs. PL/SQL
Spark vs. PL/SQL
 

Mehr von Florian Hopf

Modern Java Features
Modern Java Features Modern Java Features
Modern Java Features Florian Hopf
 
Einführung in Elasticsearch
Einführung in ElasticsearchEinführung in Elasticsearch
Einführung in ElasticsearchFlorian Hopf
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearchFlorian Hopf
 
Java clients for elasticsearch
Java clients for elasticsearchJava clients for elasticsearch
Java clients for elasticsearchFlorian Hopf
 
Einfuehrung in Elasticsearch
Einfuehrung in ElasticsearchEinfuehrung in Elasticsearch
Einfuehrung in ElasticsearchFlorian Hopf
 
Data modeling for Elasticsearch
Data modeling for ElasticsearchData modeling for Elasticsearch
Data modeling for ElasticsearchFlorian Hopf
 
Einführung in Elasticsearch
Einführung in ElasticsearchEinführung in Elasticsearch
Einführung in ElasticsearchFlorian Hopf
 
Elasticsearch und die Java-Welt
Elasticsearch und die Java-WeltElasticsearch und die Java-Welt
Elasticsearch und die Java-WeltFlorian Hopf
 
Anwendungsfälle für Elasticsearch JAX 2015
Anwendungsfälle für Elasticsearch JAX 2015Anwendungsfälle für Elasticsearch JAX 2015
Anwendungsfälle für Elasticsearch JAX 2015Florian Hopf
 
Anwendungsfälle für Elasticsearch JavaLand 2015
Anwendungsfälle für Elasticsearch JavaLand 2015Anwendungsfälle für Elasticsearch JavaLand 2015
Anwendungsfälle für Elasticsearch JavaLand 2015Florian Hopf
 
Anwendungsfaelle für Elasticsearch
Anwendungsfaelle für ElasticsearchAnwendungsfaelle für Elasticsearch
Anwendungsfaelle für ElasticsearchFlorian Hopf
 
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)Florian Hopf
 
Search Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchSearch Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchFlorian Hopf
 
Akka Presentation Schule@synyx
Akka Presentation Schule@synyxAkka Presentation Schule@synyx
Akka Presentation Schule@synyxFlorian Hopf
 

Mehr von Florian Hopf (14)

Modern Java Features
Modern Java Features Modern Java Features
Modern Java Features
 
Einführung in Elasticsearch
Einführung in ElasticsearchEinführung in Elasticsearch
Einführung in Elasticsearch
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearch
 
Java clients for elasticsearch
Java clients for elasticsearchJava clients for elasticsearch
Java clients for elasticsearch
 
Einfuehrung in Elasticsearch
Einfuehrung in ElasticsearchEinfuehrung in Elasticsearch
Einfuehrung in Elasticsearch
 
Data modeling for Elasticsearch
Data modeling for ElasticsearchData modeling for Elasticsearch
Data modeling for Elasticsearch
 
Einführung in Elasticsearch
Einführung in ElasticsearchEinführung in Elasticsearch
Einführung in Elasticsearch
 
Elasticsearch und die Java-Welt
Elasticsearch und die Java-WeltElasticsearch und die Java-Welt
Elasticsearch und die Java-Welt
 
Anwendungsfälle für Elasticsearch JAX 2015
Anwendungsfälle für Elasticsearch JAX 2015Anwendungsfälle für Elasticsearch JAX 2015
Anwendungsfälle für Elasticsearch JAX 2015
 
Anwendungsfälle für Elasticsearch JavaLand 2015
Anwendungsfälle für Elasticsearch JavaLand 2015Anwendungsfälle für Elasticsearch JavaLand 2015
Anwendungsfälle für Elasticsearch JavaLand 2015
 
Anwendungsfaelle für Elasticsearch
Anwendungsfaelle für ElasticsearchAnwendungsfaelle für Elasticsearch
Anwendungsfaelle für Elasticsearch
 
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
Search Evolution - Von Lucene zu Solr und ElasticSearch (Majug 20.06.2013)
 
Search Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchSearch Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearch
 
Akka Presentation Schule@synyx
Akka Presentation Schule@synyxAkka Presentation Schule@synyx
Akka Presentation Schule@synyx
 

Lucene Solr talk at Java User Group Karlsruhe

  • 1. Suchen und Finden mit Lucene und Solr Florian Hopf 04.07.2012
  • 3.
  • 4. Suche Go
  • 5. Suche Go Ergebnis 1 In Ergebnis 1 taucht der Suchbegriff auf... Ergebnis 2 In Ergebnis 2 taucht der Suchbegriff auch auf ... Ergebnis 3 … hier steht der Suchbegriff aus Ergebnis 3...
  • 6. Suche Go Ergebnis 1 SQL In Ergebnis 1 taucht der Suchbegriff auf... Ergebnis 2 In Ergebnis 2 taucht der Suchbegriff auch auf ... Ergebnis 3 … hier steht der Suchbegriff aus Ergebnis 3...
  • 7.
  • 8. Speaker * name Talk title * content * talkdate Category * name
  • 9. mysql> select * from talk where title like "%apache%"; +----+-------------------------------------------+---------+------------+ | id | title | content | talkdate | +----+-------------------------------------------+---------+------------+ | 1 | Apache Karaf | ... | 2012-04-25 | | 2 | Integration ganz einfach mit Apache Camel | ... | 2012-04-04 | +----+-------------------------------------------+---------+------------+ 2 rows in set (0.00 sec)
  • 10. mysql> select * from talk t join talk_category tc join category c where t.id = tc.talk and tc.category = c.id and (c.name like '%OSGi%' or t.title like '%OSGi%' or t.content like '%OSGi%'); +----+-------------------------------------------+---------+------------ +------+----------+----+------+ | id | title | content | talkdate | talk | category | id | name | +----+-------------------------------------------+---------+------------ +------+----------+----+------+ | 1 | Apache Karaf | ... | 2012-04-25 | 1 | 1 | 1 | OSGi | | 2 | Integration ... | ... | 2012-04-04 | 2 | 1 | 1 | OSGi | +----+-------------------------------------------+---------+------------ +------+----------+----+------+ 2 rows in set (0.00 sec)
  • 11. Performance? ● Ranking? ● False Positives ● Ähnlichkeitssuche (Meyer <=> Meier) ● Flexibilität? ● Wartbarkeit?
  • 12. Suche Go Ergebnis 1 In Ergebnis 1 taucht der Suchbegriff auf... Ergebnis 2 In Ergebnis 2 taucht der Suchbegriff auch auf ... Ergebnis 3 … hier steht der Suchbegriff aus Ergebnis 3...
  • 13. File directory = new File(dir); File[] textFiles = directory.listFiles(new TextFiles()); for (File probableMatch : textFiles) { String text = readText(probableMatch); if (text.matches(".*" + Pattern.quote(term) + ".*")) { filesWithMatches.add(probableMatch.getAbsolutePath()); } }
  • 14. Skalierbarkeit? ● Unterschiedliche Formate? ● Ranking? ● Kombination mit Datenbank?
  • 15. SQL Suche Go Ergebnis 1 In Ergebnis 1 taucht der Suchbegriff auf... Ergebnis 2 In Ergebnis 2 taucht der Suchbegriff auch auf ... Ergebnis 3 … hier steht der Suchbegriff aus Ergebnis 3...
  • 16. Dokument 1 Die Stadt liegt in den Bergen. Dokument 2 Vom Berg kann man die Stadt sehen.
  • 17. Dokument 1 Die 1 Die Stadt 1. Tokenization Stadt 1,2 liegt in den liegt 1 Bergen. in 1 den 1 Bergen 1 Vom 2 Dokument 2 Berg 2 Vom Berg kann 2 kann man die Stadt man 2 sehen. die 2 sehen 2
  • 18. Dokument 1 die 1,2 Die Stadt 1. Tokenization stadt 1,2 liegt in den liegt 1 Bergen. in 1 2. Lowercasing den 1 bergen 1 Dokument 2 vom 2 Vom Berg berg 2 kann man kann 2 die Stadt sehen. man 2 sehen 2
  • 19. Dokument 1 die 1,2 Die Stadt 1. Tokenization stadt 1,2 liegt in den Bergen. liegt 1 in 1 2. Lowercasing den 1 berg 1,2 Dokument 2 3. Stemming vom 2 Vom Berg kann man kann 2 die Stadt man 2 sehen. seh 2
  • 20.
  • 21. Java-Bibliothek ● Invertierter Index ● Analyzer ● Query-Syntax ● Relevanz-Algorithmus ● KEIN Crawler ● KEIN Document-Extractor
  • 23. Indexieren: ● Erstellen eines Documents ● Festlegen des Analyzers ● Indexieren über IndexWriter ● Suchen: ● Verwendung des selben Analyzers ● Parsen der Query mit QueryParser ● Auslesen über IndexSearcher/IndexReader ● Ausgabe über Document
  • 24. Document Field title title Integration1 Name ganz einfach mit Apache Camel Value Value 1 Field date title Name 1 20120404 Value Value 1 Field title speaker title Integration1Christian Schneider Name ganz einfach mit Apache Camel Value Value 1 Document Field title title Integration1 Apache KarafApache Camel Name ganz einfach mit Value 1 Value Field date title Name 1 20120425 Value Value 1 Field title speaker title Integration1Christian Schneider Name ganz einfach mit Apache Camel Value Value 1 Field title speaker title Integration1 Achim Nierbeck Name ganz einfach mit Apache Camel Value Value 1
  • 25. Index ● ANALYZED ● NOT_ANALYZED ● NO ● Store ● YES/NO ● Feldtyp ● String, Numeric, Boolean
  • 26.
  • 28. Analyzer Analyzer Tokenizer StandardTokenizer TokenFilter StandardFilter TokenFilter LowercaseFilter TokenFilter GermanNormalizationFilter TokenFilter GermanLightStemFilter
  • 29. Document IndexWriter Directory Analyzer
  • 30.
  • 31. DEMO
  • 32. Document IndexWriter Directory QueryParser Analyzer Query IndexSearcher IndexReader
  • 33.
  • 34. TermQuery ● Apache ● title:Apache ● Boolean Query ● Apache AND Karaf ● PhraseQuery ● "Apache Karaf"
  • 35. WildcardQuery ● Integ* ● Te?t ● RangeQuery ● date:[20120705 TO 20121231] ● FuzzyQuery ● Schneyder~
  • 36. title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430]
  • 37. title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430] BooleanQuery AND TermQuery FuzzyQuery RangeQuery title:apach speaker:schneyder date:[...]
  • 38. title:Apache AND speaker:schneyder~ AND date:[20120401 TO 20120430] BooleanQuery AND TermQuery FuzzyQuery RangeQuery title:apach speaker:schneyder date:[...]
  • 39. FilterQueries ● Ausschlusskriterium, kann gecacht werden ● Sortierung ● Boosting ● Indexing-Time ● Query-Time
  • 40. score(q , d )=coord (q , d )∗queryNorm (q )∗∑ (tf (t , d )∗idf (t)2∗t.boost∗norm (t , d )) t ∈q
  • 41. Anzahl der Invers zu Anzahl Feldlänge, Matches im Dokumente, die Index- Dokument den Term enthalten Boost score(q , d )=coord (q , d )∗queryNorm (q )∗∑ (tf (t , d )∗idf (t)2∗t.boost∗norm (t , d )) t ∈q Anzahl Term Query- im Dokument Boost
  • 42. DEMO
  • 43.
  • 44. Parser API ● Zahlreiche Formate ● Integriert OpenSource-Libs ● Betrieb embedded oder über Server
  • 45.
  • 46. DEMO
  • 47.
  • 48. Enterprise Search Server ● Basiert auf Lucene ● HTTP API ● Index-Schema ● Integriert häufig verwendete Lucene-Module ● Facettierung ● Dismax Query Parser ● Admin-Interface
  • 49. Webapp Webapp XML, JSON, JavaBin, Ruby, ... Client http Solr Lucene
  • 50. Solr Home conf data solr- schema.xml Lucene config.xml
  • 51. schema.xml Field Types Fields
  • 52.
  • 53.
  • 54. Search Index Index Start Indexing Update DB Solr URL Request DIH Cell Files Handler Search Handler Caches Replication Search Comp. Lucene Monitoring
  • 55. solrconfig.xml Lucene Config Caches Request Handler Search Components
  • 56.
  • 57. Webapp Webapp XML, JSON, JavaBin, Ruby, ... Client http Solr Lucene
  • 58.
  • 59.
  • 60. DEMO
  • 61.
  • 62. Index Master Replicate Slave Slave Loadbalancer Search
  • 63. Geospatial Search ● More like this ● Spellchecker ● Suggester ● Result Grouping ● Function Queries ● Sharding
  • 64.
  • 65. Suchserver basierend auf Apache Lucene ● RESTful API ● Dokumentenorientiert (JSON) ● Schemafrei ● Distributed Search ● Near Realtime Search ● No Commits (Transaction Log)
  • 66. curl -XPOST 'http://localhost:9200/jugka/talk/' -d '{ "speaker" : "Florian Hopf", "date" : "2012-07-04T19:30:00", "title" : "Suchen und Finden mit Lucene und Solr"}' {"ok":true,"_index":"jugka","_type":"talk", "_id":"CeltdivQRGSvLY_dBZv1jw","_version":1}
  • 68. http://lucene.apache.org ● http://tika.apache.org ● http://lucene.apache.org/solr/ ● http://elasticsearch.org ● http://github.com/fhopf/lucene-solr-talk