Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare ist ein Scribd-Unternehmen logo
Suchen und Finden mit
   Lucene und Solr
      Florian Hopf
      04.07.2012
http://techcrunch.com/2010/08/04/schmidt-data/
Lucene Solr talk at Java User Group Karlsruhe
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...
Lucene Solr talk at Java User Group Karlsruhe
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
Lucene Solr talk at Java User Group Karlsruhe
●   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
Lucene Solr talk at Java User Group Karlsruhe
Analyzer


Tokenizer


TokenFilter


TokenFilter


TokenFilter


TokenFilter
Analyzer             Analyzer


Tokenizer        StandardTokenizer


TokenFilter        StandardFilter


TokenFilter        LowercaseFilter


TokenFilter   GermanNormalizationFilter


TokenFilter    GermanLightStemFilter
Document   IndexWriter




                         Directory
            Analyzer
Lucene Solr talk at Java User Group Karlsruhe
DEMO
Document           IndexWriter




                                                Directory
QueryParser          Analyzer




  Query       IndexSearcher       IndexReader
Lucene Solr talk at Java User Group Karlsruhe
●   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
Lucene Solr talk at Java User Group Karlsruhe
●   Parser API
●   Zahlreiche Formate
●   Integriert OpenSource-Libs
●   Betrieb embedded oder über Server
Lucene Solr talk at Java User Group Karlsruhe
DEMO
Lucene Solr talk at Java User Group Karlsruhe
●   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
Lucene Solr talk at Java User Group Karlsruhe
Lucene Solr talk at Java User Group Karlsruhe
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
Lucene Solr talk at Java User Group Karlsruhe
Webapp                                          Webapp
         XML, JSON, JavaBin, Ruby, ...




Client              http                 Solr            Lucene
Lucene Solr talk at Java User Group Karlsruhe
Lucene Solr talk at Java User Group Karlsruhe
DEMO
Lucene Solr talk at Java User Group Karlsruhe
Index



          Master



          Replicate



Slave                       Slave




        Loadbalancer




           Search
●   Geospatial Search
●   More like this
●   Spellchecker
●   Suggester
●   Result Grouping
●   Function Queries
●   Sharding
Lucene Solr talk at Java User Group Karlsruhe
●   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

Lucene Solr talk at Java User Group Karlsruhe

  • 1. Suchen und Finden mit Lucene und Solr Florian Hopf 04.07.2012
  • 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...
  • 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
  • 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
  • 28. Analyzer Analyzer Tokenizer StandardTokenizer TokenFilter StandardFilter TokenFilter LowercaseFilter TokenFilter GermanNormalizationFilter TokenFilter GermanLightStemFilter
  • 29. Document IndexWriter Directory Analyzer
  • 31. DEMO
  • 32. Document IndexWriter Directory QueryParser Analyzer Query IndexSearcher IndexReader
  • 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
  • 44. Parser API ● Zahlreiche Formate ● Integriert OpenSource-Libs ● Betrieb embedded oder über Server
  • 46. DEMO
  • 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
  • 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
  • 57. Webapp Webapp XML, JSON, JavaBin, Ruby, ... Client http Solr Lucene
  • 60. DEMO
  • 62. Index Master Replicate Slave Slave Loadbalancer Search
  • 63. Geospatial Search ● More like this ● Spellchecker ● Suggester ● Result Grouping ● Function Queries ● Sharding
  • 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