SlideShare ist ein Scribd-Unternehmen logo
1 von 81
Downloaden Sie, um offline zu lesen
Vortrag	
  Solr	
  	
  	
  JUG	
  Bielefeld	
  Mai	
  2014	
  	
  	
  
	
  
 	
   	
  	
  	
  	
  
2	
  
Agenda	
  
nionex|	
  Solr	
  
!   Query	
  Tuning	
  
!   Skalierbarkeit	
  
	
  
	
  
!   Einordnung	
  
!   Features	
  
!   Demo	
  
	
  
!   Suchfeatures	
  
!   Admin-­‐Oberfläche	
  
!   Schema	
  KonfiguraNon	
  
!   Suchhandler	
  KonfiguraNon	
  
	
  
Solr	
  Überblick	
   Solr	
  in	
  AcNon	
   Solr	
  	
  Advanced	
  
Solr	
  Überblick	
   Management	
  Summary	
  
4	
  nionex|	
  Solr	
  
Solr	
  Einordnung	
  
! Solr	
  =	
  Suchserver	
  basierend	
  auf	
  Lucene	
  
! Lucene	
  =	
  Java	
  Bibliothek	
  zur	
  Volltextsuche	
  
	
  
AlternaNve	
  Lösungen	
  
! ElasNcsearch	
  basierend	
  auf	
  Lucene	
  
! Lucene	
  (als	
  integrierte	
  Suchmaschine)	
  
! Kommerzielle	
  Produkte	
  
	
  
	
  
5	
  nionex|	
  Solr	
  
Features	
  
! Auto	
  compleNon	
  
! HighlighNng	
  
! FaceNng	
  
! Spellchecker	
  
! LinguisNsche	
  Analyse	
  (Stammformen,	
  Komposita)	
  
! Steuerung	
  der	
  Relevanz	
  
! Unscharfe	
  Suche	
  
! Geographische	
  Suche	
  
! Skalierbarkeit	
  
! TextextrakNon	
  (Word,	
  Pdf,	
  etc.)	
  mit	
  Tika	
  
! Java-­‐Api	
  
! ...	
  	
  gleich	
  mehr	
  
Solr	
  in	
  AcNon	
  
7	
  nionex|	
  Solr	
  
Solr	
  starten	
  
Solr	
  herunterladen	
  und	
  auspacken	
  
cd example!
java -jar start.jar!
	
  
8	
  nionex|	
  Solr	
  
Solr	
  Adminoberfläche	
  
hap://localhost:8983/solr/#/collecNon1	
  
	
  
9	
  nionex|	
  Solr	
  
Solr	
  Adminoberfläche	
  
hap://localhost:8983/solr/#/collecNon1/documents	
  
	
  
Inhalt	
  zu	
  Testzwecken	
  in	
  den	
  Index	
  laden	
  
	
  
{"id":"1","Ntle":"hallo	
  welt",	
  "text":"drei	
  große	
  beispielworte"}	
  	
  
	
  
10	
  nionex|	
  Solr	
  
Solr	
  Adminoberfläche	
  
Suche	
  ausführen	
  
hap://localhost:8983/solr/#/collecNon1/query	
  
	
  
11	
  nionex|	
  Solr	
  
Solr	
  Adminoberfläche	
  
hap://localhost:8983/solr/admin/cores?acNon=RELOAD&core=collecNon1	
  
	
  
KonfiguraNon	
  neu	
  laden	
  
	
  
	
  
12	
  nionex|	
  Solr	
  
Solr	
  KonfiguraNon	
  
schema.xml 	
   	
  DeklaraNon	
  der	
  Felder	
  und	
  Datentypen	
  
	
  
solrconfig.xml 	
  BasiskonfiguraNon	
  für	
  SearchHandler,	
  Caches,	
  etc.	
  
	
  
	
  
13	
  nionex|	
  Solr	
  
schema.xml	
  	
  -­‐	
  	
  fields	
  
<field	
  name="Ntle"	
  type="text"	
  stored="true"	
  	
  />	
  
	
  
Eine	
  FeldkonfiguraNon	
  besteht	
  aus	
  folgenden	
  Angaben	
  
! name	
  
! type	
  
! stored	
  (Input	
  Wert	
  wird	
  direkt	
  abgespeichert)	
  
! ...	
  
	
  
	
  
	
  
14	
  nionex|	
  Solr	
  
schema.xml	
  	
  -­‐	
  	
  fields	
  
Beispiel	
  KonfiguraNon	
  mit	
  mehreren	
  Feldern:	
  
	
  
<field	
  name=",tle"	
  type="text"	
  />	
  
<field	
  name="text"	
  	
  type="text"	
  />	
  
<field	
  name="last_modified"	
  type="date"	
  />	
  
<field	
  name="content_type"	
  type="string"	
  />	
  
15	
  nionex|	
  Solr	
  
schema.xml	
  	
  -­‐	
  	
  Datentypen	
  
„PrimiNve“	
  vordefinierte	
  Datentypen:	
  
! String	
  
! Date	
  
! Integer	
  
=>	
  Keine	
  Anpassungen	
  notwendig	
  
16	
  nionex|	
  Solr	
  
schema.xml	
  	
  -­‐	
  	
  Datentypen	
  
Texwelder	
  
! beispielhaxe	
  Feldtypen	
  vorgegeben	
  
! Eigene	
  KonfiguraNon	
  notwendig	
  
! Mit	
  unendlich	
  viele	
  Möglichkeiten	
  
! Abhängig	
  vom	
  UseCase	
  
	
  
17	
  nionex|	
  Solr	
  
schema.xml	
  	
  -­‐	
  	
  Datentypen	
  
!   ein	
  Tokenizer	
  
!   beliebig	
  viele	
  Filter	
  
	
  
	
  <fieldType	
  name="text_de"	
  class="solr.TextField">	
  
	
  	
  	
  	
  	
  	
  <analyzer>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <tokenizer	
  class="solr.StandardTokenizerFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.LowerCaseFilterFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.StopFilterFactory"	
  />	
  
	
  	
  	
  	
  	
  	
  	
  	
  ....	
  
	
  	
  	
  	
  	
  	
  	
  </analyzer>	
  
	
  	
  	
  	
  </fieldType>	
  
	
  
	
  
18	
  nionex|	
  Solr	
  
UseCase:	
  Text	
  einer	
  deutschen	
  Internetseite	
  
	
  
	
  <fieldType	
  name="text_de"	
  class="solr.TextField">	
  
	
  	
  	
  	
  	
  	
  <analyzer>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <tokenizer	
  class="solr.StandardTokenizerFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.LowerCaseFilterFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.StopFilterFactory"	
  />	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.SynonymFilterFactory"	
  synonyms="syn.txt"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.GermanNormaliza,onFilterFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.ASCIIFoldingFilterFactory"/>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <filter	
  class="solr.GermanLightStemFilterFactory"/>	
  
	
  	
  	
  	
  	
  	
  </analyzer>	
  
	
  	
  	
  	
  </fieldType>	
  
	
  
	
  
19	
  nionex|	
  Solr	
  
Analysis	
  Chain	
  
hap://localhost:8983/solr/	
  -­‐	
  /collecNon1/analysis	
  
	
  
	
  
	
  
20	
  nionex|	
  Solr	
  
UseCase:	
  Text	
  einer	
  deutschen	
  Internetseite	
  
!   Analysis	
  Chain	
  wird	
  bei	
  Indizierung	
  und	
  Suche	
  ausgeführt!	
  
!   Beispieldokument:	
  "Das	
  ist	
  ein	
  großer	
  Traktor"	
  
!   =>	
  Indiziert	
  wird	
  "gross	
  traktor	
  trecker"	
  
!   Suche:	
  "der	
  große	
  trecker"	
  
!   =>	
  Suche	
  mit	
  "gross	
  trecker	
  traktor"	
  
!   =>	
  findet	
  Dokument	
  
	
  
21	
  nionex|	
  Solr	
  
Sprachabhängige	
  Indizierung	
  
! 5	
  verschiedene	
  Stemming	
  Algorithmen	
  für	
  deutsch	
  
! unterschiedliche	
  „Aggressivität“	
  
! Beispiel:	
  combine	
  vs.	
  combinaNon	
  
	
  
	
  
	
  
hap://localhost:8983/solr/	
  -­‐	
  /collecNon1/analysis	
  
	
  
	
  
	
  
22	
  nionex|	
  Solr	
  
Sprachabhängige	
  Indizierung	
  
! Eigener	
  FieldType	
  für	
  jede	
  Sprache	
  mit	
  eigener	
  Analyzer	
  Keae	
  
! Deutsches	
  Stemming,	
  Stopwords,	
  etc.	
  für	
  deutsche	
  Texte	
  
! Englisches	
  Stemming,	
  Stopwords,	
  etc.	
  für	
  englische	
  Texte	
  
! Sprachliche	
  Besonderheiten	
  beachten	
  
englisch:	
  Possesive	
  (David's	
  bike);	
  französisch:	
  Elisionen	
  (l'agnosNque)	
  
23	
  nionex|	
  Solr	
  
Sprachabhängige	
  Indizierung	
  
! AutomaNsche	
  Spracherkennung	
  
! Anhängen	
  von	
  Suffix	
  an	
  Feldname:	
  text	
  =>	
  text_de	
  oder	
  text_en	
  
24	
  nionex|	
  Solr	
  
UseCase	
  Komposita	
  
! Beispiele:	
  Donaudampfschiffahrtskapitän,	
  Fensterbeschläge	
  
<filter	
  class="solr.DicNonaryCompoundWordTokenFilterFactory"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  dicNonary="dicNonary.txt"/>	
  
	
  
	
  
	
  
	
  
25	
  nionex|	
  Solr	
  
UseCase	
  Komposita	
  
! Problem:	
  DicNonary	
  muss	
  manuell	
  erstellt	
  werden	
  
! Hilfsmiael:	
  Schemabrowser:	
  
hap://localhost:8983/solr/#/be/schema-­‐browser?field=text	
  
	
  
	
  
	
  
	
  
26	
  nionex|	
  Solr	
  
Sprachabhängige	
  Indizierung	
  
Weiterführende	
  Doku	
  für	
  sprachabhängige	
  SchemadefiniNon	
  
! Detec%ng	
  Languages	
  During	
  Indexing	
  in	
  Solr	
  Reference	
  Guide	
  
! hap://wiki.apache.org/solr/LanguageAnalysis	
  
27	
  nionex|	
  Solr	
  
UseCase	
  Eigennamen	
  /	
  Produktnamen	
  
! Beispiel:	
  SuperDuper-­‐XL500	
  
! Lösung:	
  WordDelimiterFilterFactory	
  
! Spli€ng	
  an	
  CamelCase,	
  Zahlen,	
  etc.	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
28	
  nionex|	
  Solr	
  
UseCase	
  unscharfe	
  Suche	
  
! Stemming	
  +	
  Kompositazerlegung	
  +	
  Synonyme	
  ausreichend?	
  
! PhoneNsche	
  Filter	
  PhoneNcFilterFactory	
  (häufig	
  viele	
  falsche	
  Treffer)	
  
! Beider-­‐Morse	
  Filter,	
  speziell	
  für	
  Namen	
  
! Fuzzy	
  Suche	
  (mit	
  Lucene	
  4	
  deutlich	
  schneller	
  geworden)	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
29	
  nionex|	
  Solr	
  
Weiterführende	
  Links	
  Tokenizer	
  /	
  Filter	
  
Auflistung	
  vieler	
  Tokenizer	
  und	
  Filter	
  
! hap://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters	
  
	
  
	
  
	
  
	
  
	
  
30	
  nionex|	
  Solr	
  
solrconfig.xml	
  
KonfiguraNon	
  von	
  
! weiteren	
  Java-­‐Bibliotheken	
  (jars)	
  
! Caching	
  
! SearchHandler	
  (Suchanfragen)	
  
! UpdateHandler	
  (Datenimport)	
  
! verschiedenen	
  Komponenten	
  
! HighlighNng	
  
! Spellchecker	
  
! Siehe	
  auch	
  hap://wiki.apache.org/solr/SolrConfigXml	
  
	
  
31	
  nionex|	
  Solr	
  
SearchHandler	
  
Bestandteile	
  einer	
  SearchHandler-­‐KonfiguraNon	
  
! Url-­‐Segment	
  
! Liste	
  von	
  Parametern	
  
	
  
<requestHandler	
  name="/select"	
  class="solr.SearchHandler">	
  
	
  	
  	
  	
  	
  <lst	
  name="defaults">	
  
	
  	
  	
  	
  	
  	
  	
  <int	
  name="rows">10</int>	
  
	
  	
  	
  	
  	
  	
  	
  <str	
  name="df">text</str>	
  
	
  	
  	
  	
  	
  </lst>	
  
</requestHandler>	
  
	
  
32	
  nionex|	
  Solr	
  
SearchHandler	
  
Aufruf	
  mit:	
  
hap://localhost:8983/solr/collecNon1/select?q=Ntle:solr	
  
	
  
33	
  nionex|	
  Solr	
  
SearchHandler	
  
Parameter	
  können	
  in	
  solrconfig.xml	
  oder	
  per	
  Request	
  angegeben	
  werden	
  
! <int	
  name="rows">10</int>	
  
! hap://localhost:8983/solr/wiki/select?q=test&rows=10	
  
	
  
	
  
	
  
	
  
34	
  nionex|	
  Solr	
  
SearchHandler	
  
Parameter	
  Typen	
  
! default:	
  kann	
  von	
  Request	
  Parameter	
  überlagert	
  werden	
  
! invariants:	
  nicht	
  veränderbar	
  
! appends:	
  KombinaNon	
  mit	
  Request	
  Parametern	
  
<requestHandler	
  name="/select"	
  class="solr.SearchHandler">	
  
	
  	
  	
  	
  	
  <lst	
  name="defaults“>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <int	
  name="rows">10</int>	
  
	
  	
  	
  	
  	
  </lst>	
  
</requestHandler>	
  
	
  
	
  
	
  
35	
  nionex|	
  Solr	
  
ExtendedDisMax	
  Handler	
  
! Sehr	
  robustes	
  Verhalten	
  für	
  Benutzer	
  Eingaben	
  
! Google	
  Syntax	
  
	
  
! Wildcards	
  
! Lucene-­‐Queries	
  über	
  Filterqueries	
  oder	
  Boostqueries	
  
! Filter:	
  Zeige	
  nur	
  Dokumente	
  vom	
  Typ	
  Pdf	
  an	
  
! Boost:	
  Zeige	
  zuerst	
  alle	
  Dokumente	
  unterhalb	
  von	
  /web	
  an	
  
	
  
36	
  nionex|	
  Solr	
  
OpNonen	
  1:	
  Basis	
  
<requestHandler	
  name="/search"...>	
  
...	
  
	
  	
  	
  	
  	
  	
  <str	
  name="defType">edismax</str>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="qf">text	
  Ntle</str>	
  
...	
  
	
  
name 	
   	
  Urlsegment	
  des	
  Handlers	
  
defType	
   	
  Handlertyp	
  (ExtendedDisMax)	
  
qf 	
   	
   	
  Feldern	
  in	
  denen	
  gesucht	
  wird	
  
	
  
	
  
	
  
37	
  nionex|	
  Solr	
  
OpNonen	
  2:	
  Filter	
  
<requestHandler	
  name="/search"...>	
  
...	
  
	
  	
  	
  	
  	
  	
  <int	
  name="fq">category:news</int>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="mm">100%</str>	
  
...	
  
	
  
fq 	
   	
   	
  Filterquery	
  in	
  Lucene-­‐Syntax	
  
mm	
   	
   	
  Minimum	
  should	
  match	
  
	
  
	
  
	
  
	
  
38	
  nionex|	
  Solr	
  
OpNonen	
  3:	
  Rückgabe	
  
<requestHandler	
  name="/search"...>	
  
...	
  
	
  	
  	
  	
  	
  	
  <str	
  name="fl">id	
  path	
  Ntle	
  text	
  score</str>	
  
	
  	
  	
  	
  	
  	
  <int	
  name="rows">10</int>	
  
...	
  
	
  
fl 	
   	
   	
  Felder,	
  die	
  zurückgegeben	
  werden	
  
rows 	
   	
  Anzahl	
  der	
  zurückgegebenen	
  Zeilen	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
	
  
39	
  nionex|	
  Solr	
  
OpNonen	
  4:	
  Boost	
  
<requestHandler	
  name="/search"...>	
  
...	
  
	
  	
  	
  	
  	
  	
  <str	
  name="qf">text	
  Ntle^5</str>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="pf">text^10	
  Ntle^50	
  text_nostem^20	
  Ntle_nostem^100</str>	
  
	
  	
  	
  	
  	
  	
  <int	
  name="bq">project:search^20</int>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11,	
  2000,1)</str>	
  
...	
  
	
  
pf 	
   	
   	
  Phrase	
  Fields:	
  BoosNng	
  für	
  passende	
  Phrasen	
  
bq 	
   	
   	
  Boostquery	
  in	
  Lucene-­‐Syntax	
  
bf 	
   	
   	
  BooswuncNon	
  (Beispiel	
  Boost	
  nach	
  Datum)	
  
	
  
	
  
	
  
	
  
	
  
40	
  nionex|	
  Solr	
  
Extended	
  Dismax	
  Links	
  
Weiterführende	
  DokumentaNon	
  
! hap://wiki.apache.org/solr/ExtendedDisMax	
  
	
  
41	
  nionex|	
  Solr	
  
SpaNal	
  Search	
  
! fq={!geofilt+pt=51.856629,8.310277+sfield=store+d=10}	
  
! pt	
  =	
  Point	
  =	
  Ausgangspunkt	
  für	
  Suche	
  
! d	
  =	
  Distance	
  =	
  max.	
  Enwernung	
  
! Doku:	
  hap://wiki.apache.org/solr/SpaNalSearch	
  
	
  
hap://localhost:8983/solr/collecNon1/search?q=entwickler&fq=%7B!geofilt+pt=51.856629,8.310277+sfield=store+d=50%7D}	
  
	
  
	
  
	
  
42	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Parameter	
  
	
  Parameter	
   Beschreibung	
   Beispielwerte	
  
facet	
   AkNvierung	
   on	
  
facet.field	
   Angabe	
  der	
  Felder	
  
mehrere	
  Werte	
  möglich	
  
arNcleYear	
  
facet.sort	
  
	
  
SorNerung,	
  default	
  
Trefferzahl	
  
index	
  (alphabeNsch)	
  
f.arNcleYear.facet.sort	
   KonfiguraNon	
  pro	
  Feld	
   Index	
  
facet.mincount	
   Mindestanzahl	
  Treffer	
   3	
  
facet.limit	
   Maxanzahl	
  von	
  Werten	
   5	
  
facet.offset	
   Offset	
  für	
  Paging	
   5	
  
facet.prefix	
   Filter	
  auf	
  Werte,	
  die	
  mit	
  
angegebenen	
  String	
  
anfangen	
  
43	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Parameter	
  
	
  
Beispiel-­‐Url	
  
! hap://localhost:8983/solr/be/search_all?q=mohn&	
  
facet=on&	
  
facet.field=arNcleYear&	
  
facet.field=documentType&	
  
f.arNcleYear.facet.sort=index&	
  
facet.limit=2	
  
44	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Filterqueries	
  
! Filterquery	
  für	
  Facetwert	
  schreiben	
  
! fq=arNcleYear:2012	
  
! Problem:	
  Nur	
  noch	
  2012	
  wird	
  angezeigt	
  
! Lösung:	
  Exclude	
  Filter	
  for	
  Facet	
  	
  
fq={!tag=ay}arNcleYear:2012&facet.field={!ex=ay}arNcleYear	
  
	
  
	
  
45	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Filterqueries	
  
Problem	
  
! Filterquery	
  für	
  Werte	
  mit	
  Sonderzeichen	
  benöNgen	
  Escaping	
  
! Escaping	
  ist	
  umständlich	
  und	
  fehleranfällig	
  
! Ein	
  'Saublöder'	
  Wert	
  :)	
  
	
  
Lösung	
  
! Term	
  QueryParser	
  für	
  Filterquery	
  akNvieren	
  	
  
! fq={!term	
  f=documentType}Ein	
  'Saublöder'	
  Wert	
  :)	
  
! facet.field={!ex=dt}documentType&	
  
fq={!tag=dt	
  term	
  f=documentType}	
  Ein	
  'Saublöder'	
  Wert	
  :)	
  
46	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Ranges	
  
Wann	
  werden	
  Ranges	
  eingesetzt?	
  
! Felder	
  mit	
  Zahlen	
  oder	
  Datumswerten	
  
! Beispiele:	
  
! Datum	
  
! Preise	
  
! =>	
  Bildung	
  von	
  Bereichen	
  
	
  
	
  
47	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Ranges	
  
	
  Parameter	
   Beschreibung	
   Beispielwerte	
  
facet.range	
   Angabe	
  der	
  Felder	
  
mehrere	
  Werte	
  möglich	
  
	
  
arNcleDate	
  
facet.range.start	
   Anfangswert	
   2000-­‐01-­‐01T00:00:00Z	
  
facet.range.end	
   Endwert	
   2020-­‐01-­‐01T00:00:00Z	
  
facet.range.gap	
   Größe	
  eines	
  Schriaes	
   %2B1YEAR	
  
+1YEAR	
  
48	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Ranges	
  
	
  
Beispiel-­‐Url:	
  
! hap://localhost:8983/solr/fs/search_de?	
  
q=*&rows=0&	
  
facet=on&facet.limit=100&	
  
facet.range=arNcleDate&	
  
facet.range.start=2000-­‐01-­‐01T00:00:00Z&	
  
facet.range.end=2020-­‐01-­‐01T00:00:00Z&	
  
facet.range.gap=%2B1YEAR	
  
	
  
	
  
49	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Queries	
  
Wann	
  werden	
  Queries	
  eingesetzt?	
  
! Ranges	
  nicht	
  flexibel	
  genug	
  
! Überschneidende	
  Bereiche	
  
! =>	
  Bereiche	
  über	
  Queries	
  festlegen	
  
	
  	
  	
  	
  	
  wie	
  der	
  Name	
  schon	
  sagt	
  J	
  
50	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Queries	
  
Beispiel	
  
! Letzter	
  Monat	
  
! Letzte	
  6	
  Monate	
  
! Letztes	
  Jahr	
  
	
  
! facet.query=arNcleDate:[NOW-­‐1MONTHS	
  TO	
  NOW]	
  
! facet.query=arNcleDate:[NOW-­‐6MONTHS	
  TO	
  NOW]	
  
! facet.query=arNcleDate:[NOW-­‐1YEARS	
  TO	
  NOW]	
  
	
  
! hap://localhost:8983/solr/fs/search_de?
q=*&rows=0&facet=on&facet.query=arNcleDate:[NOW-­‐1MONTHS%20TO
%20NOW]&facet.query=arNcleDate:[NOW-­‐6MONTHS%20TO
%20NOW]&facet.query=arNcleDate:[NOW-­‐1YEARS%20TO%20NOW]	
  
51	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Pivot	
  
! facet.pivot=documentType,arNcleYear	
  
2010	
   2011	
   2012	
   gesamt	
  
news	
   2	
   3	
   7	
   12	
  
video	
   1	
   2	
   0	
   3	
  
project	
   6	
   3	
   4	
   13	
  
gesamt	
   9	
   8	
   11	
   28	
  
hap://localhost:8983/solr/be/search_de	
  
?q=*&rows=0	
  
&facet.pivot=documentType,arNcleYear	
  
&wt=xslt&tr=pivot.xsl	
  
	
  
	
  	
  	
  
52	
  nionex|	
  Solr	
  
Facets	
  -­‐	
  Links	
  
Weiterführende	
  Links	
  
! hap://wiki.apache.org/solr/SimpleFacetParameters	
  
53	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Zwei	
  verschiedene	
  Lösungsansätze:	
  
! Facet	
  Queries	
  
! Suggester	
  Komponente	
  
54	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Facet	
  Queries	
  
! Normale	
  Suchanfrage	
  
! „Face€erung“	
  nach	
  allen	
  Wörtern	
  im	
  Volltext	
  
! Filterung	
  nach	
  Prefix	
  
	
  
55	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Beispiel	
  für	
  AutocompleNon	
  mit	
  Facet	
  Query	
  
hap://localhost:8983/solr/wiki/search?
rows=0&facet.field=text&facet.prefix=be&facet.method=enum&facet.limit=10	
  
	
  
	
  
	
  
56	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Suggester	
  Komponente	
  
! Empfohlener	
  Lösungsansatz	
  für	
  AutocompleNon	
  (im	
  Gegensatz	
  zu	
  Facet-­‐Lösung)	
  
! Extrem	
  schnell	
  	
  1	
  ms	
  
! Nutzung	
  der	
  Solr	
  Analyse	
  zur	
  Normalisierung	
  (z.B.	
  Lowercase,	
  Sonderzeichen)	
  
! Anzeige	
  des	
  Treffers	
  in	
  Kontext	
  (Infix,	
  Freetext)	
  
! Fuzzysuche	
  
! AkNve	
  Weiterentwicklung	
  
	
  
57	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Nachteile	
  
! Eigener	
  Index	
  notwendig	
  
=>	
  benöNgt	
  Zeit	
  beim	
  Au‹au	
  
! Keine	
  Filterung	
  möglich	
  
Beispielkunde:	
  ein	
  Index	
  für	
  160	
  verschiedene	
  Länder	
  mit	
  eigenen	
  
ProduktkombinaNonen	
  
58	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
AnalyzingLookupFactory	
  
! Normalisierung	
  über	
  Solr	
  Analyse	
  (Lowercase,	
  AsciiFolding)	
  
! Anzeige	
  des	
  Originalstrings	
  
! SorNerung	
  nach	
  Trefferhäufigkeit	
  
	
  
59	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Beispiel	
  AnalyzingLookupFactory	
  
! hap://localhost:8983/solr/wiki/suggest?q=amel	
  
	
  
60	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
FuzzyLookupFactory	
  
! Normalisierung	
  über	
  Solr	
  Analyse	
  (Lowercase,	
  AsciiFolding)	
  
! Anzeige	
  des	
  Originalstrings	
  
! Fuzzysuche	
  
	
  
	
  
	
  
	
  
61	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Beispiel	
  FuzzyLookupFactory	
  
! hap://localhost:8983/solr/wiki/suggeswuzzy?q=amelie	
  
	
  
	
  
62	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Nachteil	
  –	
  FuzzyLookupFactory	
  
! SorNerung	
  nach	
  Trefferhäufigkeit	
  
=>	
  exakte	
  Treffer	
  werden	
  nicht	
  immer	
  als	
  erstes	
  angezeigt	
  
haps://issues.apache.org/jira/browse/LUCENE-­‐5172	
  
! =>	
  Lösung	
  KombinaNon	
  aus	
  normaler	
  und	
  Fuzzysuche	
  
	
  
	
  
	
  
	
  
63	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
AnalyzingInfixLookupFactory	
  
! Normalisierung	
  über	
  Solr	
  Analyse	
  (Lowercase,	
  AsciiFolding)	
  
! Anzeige	
  des	
  Originalstrings	
  
! SorNerung	
  nach	
  Trefferhäufigkeit	
  
! Anzeige	
  des	
  gesamten	
  Felder	
  mit	
  Highligh,ng	
  des	
  Treffers	
  
! =>	
  Nur	
  für	
  kurze	
  Felder	
  (z.B.	
  Produktnamen)	
  geeignet	
  
	
  
64	
  nionex|	
  Solr	
  
AutocompleNon	
  /	
  Suggester	
  
Beispiel	
  AnalyzingInfixLookupFactory	
  
! hap://localhost:8983/solr/collecNon1/suggesNnfix?q=mei	
  
	
  
65	
  nionex|	
  Solr	
  
Zusammenfassung	
  /	
  Gegenüberstellung	
  Suggester	
  
Feature	
   Face,ng	
   Suggester	
  
Anzeige	
   analysierter	
  Text	
  
=>	
  Kein	
  Stemming	
  
Originaltext	
  
Infix	
  mit	
  Highligh,ng	
  
Performanz	
   nur	
  bis	
  miaelgroße	
  Indexes	
  
facet.method=enum	
  
sehr	
  schnell	
  
Suche	
   Normalisierung	
  notwendig	
   Suche	
  über	
  Analyzer	
  Chain	
  
Fuzzy	
  möglich	
  
Filter	
   Filterqueries	
  möglich	
   Keine	
  Filter	
  möglich	
  
ggf.	
  per	
  Prefix	
  =>	
  Aufwand!	
  
Index	
   Solr	
  Index	
   Eigener	
  Index	
  
66	
  nionex|	
  Solr	
  
HightlighNng	
  
	
  
	
  
	
  
	
  
	
  
	
  
Parameter	
  für	
  Handler	
   Beschreibung	
   Beispielwerte	
  
hl	
   AkNvierung	
  HighlighNng	
   true	
  
hl.fl	
   Liste	
  der	
  Felder	
  
Felder	
  müssen	
  stored	
  sein	
  
Ntle_nostem	
  text_nostem	
  
hl.snippets	
   Anzahl	
  der	
  angezeigten	
  
Stellen	
  
5	
  
67	
  nionex|	
  Solr	
  
HightlighNng	
  
OpNonen	
  für	
  HighlighNng	
  Komponente	
  
! Größe	
  der	
  Fragmente	
  
! HTML-­‐Tags	
  
! Berechnung	
  der	
  Fragment	
  Grenzen	
  
68	
  nionex|	
  Solr	
  
Spellchecker	
  
! Korrektur	
  des	
  Suchbegriffes	
  anhand	
  des	
  Indexes	
  
! hap://localhost:8983/solr/be/search_de?q=mispellt	
  
	
  
	
  
69	
  nionex|	
  Solr	
  
Joins	
  
! Join	
  Beispiel	
  
! SELECT	
  *	
  FROM	
  solr	
  WHERE	
  links	
  IN	
  (SELECT	
  id	
  FROM	
  solr	
  where	
  Ntle=	
  "iPad1")	
  
=>	
  Ergebnis:	
  Markus	
  
	
  
id	
   ,tle	
   links	
  
ipad1	
   iPad1	
  
ipad2	
   iPad2	
  
ipad3	
   iPad3	
  
user1	
   Markus	
   ipad1	
  
user2	
   Thorsten	
   ipad3	
  
70	
  nionex|	
  Solr	
  
Joins	
  
! Join	
  über	
  links=id	
  mit	
  Constraint	
  Ntle=iPad1	
  
! q={!join	
  from=id	
  to=links}Ntle:iPad1	
  
! Auf	
  Werte	
  aus	
  innerer	
  Abfrage	
  kann	
  nicht	
  zugegriffen	
  werden.	
  
! Join	
  über	
  mehrere	
  Cores	
  möglich,	
  wenn	
  gleiche	
  VM:	
  
{!join	
  from=path	
  to=links	
  fromIndex=fs}Ntle:iPad1	
  
! hap://localhost:8983/solr/collecNon1/search?fl=*&q={!join+from=id+to=links}
Ntle:iPad1	
  
! hap://localhost:8983/solr/collecNon1/search?fl=*&q={!join+from=path+to=links
+fromIndex=fs}Ntle:iPad1	
  
	
  
	
  
71	
  nionex|	
  Solr	
  
MoreLikeThis	
  
! Suche	
  ähnlicher	
  Dokumente	
  
! UseCase:	
  Suche	
  in	
  Intranet	
  nach	
  Dubleaen	
  
! hap://localhost:8983/solr/collecNon1/select?
q=id:mlt1&mlt=true&mlt.fl=includes&mlt.mindf=1&mlt.minw=1&fl=id,includes,score	
  
	
  
Solr	
  Advanced	
  
73	
  nionex|	
  Solr	
  
BoosNng	
  
! Häufigkeit	
  des	
  Treffers	
  vs.	
  Länge	
  des	
  Dokumentes	
  (Standard)	
  
! Unterschiedliche	
  Gewichtung	
  von	
  einzelnen	
  Feldern	
  
Titel	
  wichNger	
  als	
  Beschreibungstext	
  
! Exakter	
  Treffer	
  vs.	
  Treffer	
  mit	
  Stemming	
  	
  
! Höhere	
  Gewichtung	
  von	
  Phrasen	
  
Beispiel:	
  Suche	
  nach	
  „Reinhard	
  Mohn“	
  
! Gewichtung	
  nach	
  beliebigen	
  Kriterien;	
  Beispiele:	
  
! Alter	
  
! Kategorie	
  „WichNg“	
  
! Dokumenayp	
  
	
  
	
  
74	
  nionex|	
  Solr	
  
BoosNng	
  
<requestHandler	
  name="/search"...>	
  
...	
  
	
  	
  	
  	
  	
  	
  <str	
  name="qf">text	
  Ntle^5</str>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="pf">text^10	
  Ntle^50	
  text_nostem^20	
  Ntle_nostem^100</str>	
  
	
  	
  	
  	
  	
  	
  <int	
  name="bq">project:search^20</int>	
  
	
  	
  	
  	
  	
  	
  <str	
  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11,	
  2000,1)</str>	
  
...	
  
	
  
pf 	
   	
   	
  Phrase	
  Fields:	
  BoosNng	
  für	
  passende	
  Phrasen	
  
bq 	
   	
   	
  Boostquery	
  in	
  Lucene-­‐Syntax	
  
bf 	
   	
   	
  BooswuncNon	
  (Beispiel	
  Boost	
  nach	
  Datum)	
  
	
  
	
  
75	
  nionex|	
  Solr	
  
QueryFuncNon	
  
<str	
  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11	
  2000,1)</str>	
  
! BoosNng	
  abhängig	
  vom	
  Datum	
  
! Aktuelles	
  Datum	
  =>	
  Hohe	
  Relevanz	
  
! Differenz	
  in	
  aktuellem	
  Datum	
  
=>	
  Starke	
  Beeinflussung	
  
! Differenz	
  in	
  aktuellem	
  Datum	
  
=>	
  schwache	
  Beeinflussung	
  
! Sparsam	
  einsetzen,	
  
da	
  performanz-­‐	
  und	
  speicherintensiv	
  
	
  
76	
  nionex|	
  Solr	
  
BoosNng	
  Bemaßung	
  
! Boost-­‐Parameter	
  fließen	
  als	
  Faktoren	
  in	
  die	
  Berechnung	
  des	
  Scores	
  ein	
  
! Lineare	
  Reihe	
  =>	
  Zu	
  geringer	
  Unterschied:	
  
text^10	
  Ntle^20	
  text_nostem^30	
  Ntle_nostem^40	
  
! =>	
  Empfehlung	
  1:	
  ExponenNelle	
  Reihe:	
  
10,	
  20,	
  50,	
  100,	
  200,	
  1000	
  
	
  
! =>	
  Empfehlung	
  2:	
  Ausprobieren	
  ;-­‐)	
  
	
  
! =>	
  Empfehlung	
  3:	
  Berechnung	
  analysieren	
  (schmerzhax)	
  
	
  
	
  
77	
  nionex|	
  Solr	
  
! Indizierung	
  deutsche	
  Wikipedia	
  16	
  GB	
  XML	
  
! Einfache	
  ungecachte	
  Suchanfrage	
  20-­‐40ms	
  
! Gecachte	
  (gleiche)	
  einfache	
  Suchanfragen	
  1000	
  Requests	
  pro	
  Sekunde	
  
Skalierbarkeit	
  
78	
  nionex|	
  Solr	
  
! Viel	
  Schreiblast	
  
! Nach	
  jedem	
  Commit	
  =>	
  neuer	
  Searcher	
  =>	
  Caches	
  neu	
  au‹auen!	
  
	
  
! =>	
  verschiedene	
  Lösungsansätze	
  in	
  Solr/Lucene4	
  
! =>	
  SNchwort	
  NearRealTime	
  (NRT)	
  
Skalierbarkeit	
  -­‐	
  Probleme	
  
79	
  nionex|	
  Solr	
  
DokumentaNon	
  
! Pdf	
  Reference	
  Guide	
  
hap://lucene.apache.org/solr/documentaNon.html	
  
! Solr	
  Wiki	
  (Hier	
  landet	
  man	
  immer	
  per	
  Google)	
  
hap://wiki.apache.org/solr	
  
Fragen?	
   	
  	
  
Für	
  Fragen	
  stehen	
  wir	
  Ihnen	
  gerne	
  zur	
  Verfügung!	
  
Kontaktdaten	
   81	
  
Markus	
  Reinsch	
  
Soxware	
  Architect	
  
	
  
E-­‐Mail	
  	
  	
  markus.reinsch@bertelsmann.de	
  	
  |	
  	
  www.nionex.de	
  
	
  
Ein	
  Unternehmen	
  der	
  Bertelsmann	
  SE	
  &	
  Co.	
  KGaA	
  

Weitere ähnliche Inhalte

Ähnlich wie Solr

Sitzung 10
Sitzung 10Sitzung 10
Sitzung 10
scuy
 
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
Verein FM Konferenz
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
Dirk Ginader
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case Helvetia
Splunk
 

Ähnlich wie Solr (20)

TYPO3 Translations
TYPO3 Translations TYPO3 Translations
TYPO3 Translations
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Sitzung 10
Sitzung 10Sitzung 10
Sitzung 10
 
Node.js
Node.jsNode.js
Node.js
 
Sesam (APEX) Öffne Dich
Sesam (APEX) Öffne DichSesam (APEX) Öffne Dich
Sesam (APEX) Öffne Dich
 
MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-DesignMongoDB: Entwurfsmuster für das NoSQL-Schema-Design
MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
 
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
FMK 2013 Konstrukte diverser Programmiersprachen in FileMaker nachgebaut, Tho...
 
NRWConf2013_T4CodeGeneration
NRWConf2013_T4CodeGenerationNRWConf2013_T4CodeGeneration
NRWConf2013_T4CodeGeneration
 
OpenCms 8.5 kurz vorgestellt [LinuxTag 2013]
OpenCms 8.5 kurz vorgestellt [LinuxTag 2013]OpenCms 8.5 kurz vorgestellt [LinuxTag 2013]
OpenCms 8.5 kurz vorgestellt [LinuxTag 2013]
 
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
 
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 
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)
 
Lokalisierung für Mobile Apps
Lokalisierung für Mobile AppsLokalisierung für Mobile Apps
Lokalisierung für Mobile Apps
 
Apache Solr und TYPO3 @ Frankfurt PHP usergroup 2011-01
Apache Solr und TYPO3 @  Frankfurt PHP usergroup 2011-01Apache Solr und TYPO3 @  Frankfurt PHP usergroup 2011-01
Apache Solr und TYPO3 @ Frankfurt PHP usergroup 2011-01
 
Programmieren mit PROLOG
Programmieren mit PROLOGProgrammieren mit PROLOG
Programmieren mit PROLOG
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
SplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use CaseSplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use Case
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case Helvetia
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case Helvetia
 

Solr

  • 1. Vortrag  Solr      JUG  Bielefeld  Mai  2014        
  • 2.             2   Agenda   nionex|  Solr   !   Query  Tuning   !   Skalierbarkeit       !   Einordnung   !   Features   !   Demo     !   Suchfeatures   !   Admin-­‐Oberfläche   !   Schema  KonfiguraNon   !   Suchhandler  KonfiguraNon     Solr  Überblick   Solr  in  AcNon   Solr    Advanced  
  • 3. Solr  Überblick   Management  Summary  
  • 4. 4  nionex|  Solr   Solr  Einordnung   ! Solr  =  Suchserver  basierend  auf  Lucene   ! Lucene  =  Java  Bibliothek  zur  Volltextsuche     AlternaNve  Lösungen   ! ElasNcsearch  basierend  auf  Lucene   ! Lucene  (als  integrierte  Suchmaschine)   ! Kommerzielle  Produkte      
  • 5. 5  nionex|  Solr   Features   ! Auto  compleNon   ! HighlighNng   ! FaceNng   ! Spellchecker   ! LinguisNsche  Analyse  (Stammformen,  Komposita)   ! Steuerung  der  Relevanz   ! Unscharfe  Suche   ! Geographische  Suche   ! Skalierbarkeit   ! TextextrakNon  (Word,  Pdf,  etc.)  mit  Tika   ! Java-­‐Api   ! ...    gleich  mehr  
  • 7. 7  nionex|  Solr   Solr  starten   Solr  herunterladen  und  auspacken   cd example! java -jar start.jar!  
  • 8. 8  nionex|  Solr   Solr  Adminoberfläche   hap://localhost:8983/solr/#/collecNon1    
  • 9. 9  nionex|  Solr   Solr  Adminoberfläche   hap://localhost:8983/solr/#/collecNon1/documents     Inhalt  zu  Testzwecken  in  den  Index  laden     {"id":"1","Ntle":"hallo  welt",  "text":"drei  große  beispielworte"}      
  • 10. 10  nionex|  Solr   Solr  Adminoberfläche   Suche  ausführen   hap://localhost:8983/solr/#/collecNon1/query    
  • 11. 11  nionex|  Solr   Solr  Adminoberfläche   hap://localhost:8983/solr/admin/cores?acNon=RELOAD&core=collecNon1     KonfiguraNon  neu  laden      
  • 12. 12  nionex|  Solr   Solr  KonfiguraNon   schema.xml    DeklaraNon  der  Felder  und  Datentypen     solrconfig.xml  BasiskonfiguraNon  für  SearchHandler,  Caches,  etc.      
  • 13. 13  nionex|  Solr   schema.xml    -­‐    fields   <field  name="Ntle"  type="text"  stored="true"    />     Eine  FeldkonfiguraNon  besteht  aus  folgenden  Angaben   ! name   ! type   ! stored  (Input  Wert  wird  direkt  abgespeichert)   ! ...        
  • 14. 14  nionex|  Solr   schema.xml    -­‐    fields   Beispiel  KonfiguraNon  mit  mehreren  Feldern:     <field  name=",tle"  type="text"  />   <field  name="text"    type="text"  />   <field  name="last_modified"  type="date"  />   <field  name="content_type"  type="string"  />  
  • 15. 15  nionex|  Solr   schema.xml    -­‐    Datentypen   „PrimiNve“  vordefinierte  Datentypen:   ! String   ! Date   ! Integer   =>  Keine  Anpassungen  notwendig  
  • 16. 16  nionex|  Solr   schema.xml    -­‐    Datentypen   Texwelder   ! beispielhaxe  Feldtypen  vorgegeben   ! Eigene  KonfiguraNon  notwendig   ! Mit  unendlich  viele  Möglichkeiten   ! Abhängig  vom  UseCase    
  • 17. 17  nionex|  Solr   schema.xml    -­‐    Datentypen   !   ein  Tokenizer   !   beliebig  viele  Filter      <fieldType  name="text_de"  class="solr.TextField">              <analyzer>                  <tokenizer  class="solr.StandardTokenizerFactory"/>                  <filter  class="solr.LowerCaseFilterFactory"/>                  <filter  class="solr.StopFilterFactory"  />                  ....                </analyzer>          </fieldType>      
  • 18. 18  nionex|  Solr   UseCase:  Text  einer  deutschen  Internetseite      <fieldType  name="text_de"  class="solr.TextField">              <analyzer>                  <tokenizer  class="solr.StandardTokenizerFactory"/>                  <filter  class="solr.LowerCaseFilterFactory"/>                  <filter  class="solr.StopFilterFactory"  />                  <filter  class="solr.SynonymFilterFactory"  synonyms="syn.txt"/>                  <filter  class="solr.GermanNormaliza,onFilterFactory"/>                  <filter  class="solr.ASCIIFoldingFilterFactory"/>                  <filter  class="solr.GermanLightStemFilterFactory"/>              </analyzer>          </fieldType>      
  • 19. 19  nionex|  Solr   Analysis  Chain   hap://localhost:8983/solr/  -­‐  /collecNon1/analysis        
  • 20. 20  nionex|  Solr   UseCase:  Text  einer  deutschen  Internetseite   !   Analysis  Chain  wird  bei  Indizierung  und  Suche  ausgeführt!   !   Beispieldokument:  "Das  ist  ein  großer  Traktor"   !   =>  Indiziert  wird  "gross  traktor  trecker"   !   Suche:  "der  große  trecker"   !   =>  Suche  mit  "gross  trecker  traktor"   !   =>  findet  Dokument    
  • 21. 21  nionex|  Solr   Sprachabhängige  Indizierung   ! 5  verschiedene  Stemming  Algorithmen  für  deutsch   ! unterschiedliche  „Aggressivität“   ! Beispiel:  combine  vs.  combinaNon         hap://localhost:8983/solr/  -­‐  /collecNon1/analysis        
  • 22. 22  nionex|  Solr   Sprachabhängige  Indizierung   ! Eigener  FieldType  für  jede  Sprache  mit  eigener  Analyzer  Keae   ! Deutsches  Stemming,  Stopwords,  etc.  für  deutsche  Texte   ! Englisches  Stemming,  Stopwords,  etc.  für  englische  Texte   ! Sprachliche  Besonderheiten  beachten   englisch:  Possesive  (David's  bike);  französisch:  Elisionen  (l'agnosNque)  
  • 23. 23  nionex|  Solr   Sprachabhängige  Indizierung   ! AutomaNsche  Spracherkennung   ! Anhängen  von  Suffix  an  Feldname:  text  =>  text_de  oder  text_en  
  • 24. 24  nionex|  Solr   UseCase  Komposita   ! Beispiele:  Donaudampfschiffahrtskapitän,  Fensterbeschläge   <filter  class="solr.DicNonaryCompoundWordTokenFilterFactory"                          dicNonary="dicNonary.txt"/>          
  • 25. 25  nionex|  Solr   UseCase  Komposita   ! Problem:  DicNonary  muss  manuell  erstellt  werden   ! Hilfsmiael:  Schemabrowser:   hap://localhost:8983/solr/#/be/schema-­‐browser?field=text          
  • 26. 26  nionex|  Solr   Sprachabhängige  Indizierung   Weiterführende  Doku  für  sprachabhängige  SchemadefiniNon   ! Detec%ng  Languages  During  Indexing  in  Solr  Reference  Guide   ! hap://wiki.apache.org/solr/LanguageAnalysis  
  • 27. 27  nionex|  Solr   UseCase  Eigennamen  /  Produktnamen   ! Beispiel:  SuperDuper-­‐XL500   ! Lösung:  WordDelimiterFilterFactory   ! Spli€ng  an  CamelCase,  Zahlen,  etc.                      
  • 28. 28  nionex|  Solr   UseCase  unscharfe  Suche   ! Stemming  +  Kompositazerlegung  +  Synonyme  ausreichend?   ! PhoneNsche  Filter  PhoneNcFilterFactory  (häufig  viele  falsche  Treffer)   ! Beider-­‐Morse  Filter,  speziell  für  Namen   ! Fuzzy  Suche  (mit  Lucene  4  deutlich  schneller  geworden)                  
  • 29. 29  nionex|  Solr   Weiterführende  Links  Tokenizer  /  Filter   Auflistung  vieler  Tokenizer  und  Filter   ! hap://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters            
  • 30. 30  nionex|  Solr   solrconfig.xml   KonfiguraNon  von   ! weiteren  Java-­‐Bibliotheken  (jars)   ! Caching   ! SearchHandler  (Suchanfragen)   ! UpdateHandler  (Datenimport)   ! verschiedenen  Komponenten   ! HighlighNng   ! Spellchecker   ! Siehe  auch  hap://wiki.apache.org/solr/SolrConfigXml    
  • 31. 31  nionex|  Solr   SearchHandler   Bestandteile  einer  SearchHandler-­‐KonfiguraNon   ! Url-­‐Segment   ! Liste  von  Parametern     <requestHandler  name="/select"  class="solr.SearchHandler">            <lst  name="defaults">                <int  name="rows">10</int>                <str  name="df">text</str>            </lst>   </requestHandler>    
  • 32. 32  nionex|  Solr   SearchHandler   Aufruf  mit:   hap://localhost:8983/solr/collecNon1/select?q=Ntle:solr    
  • 33. 33  nionex|  Solr   SearchHandler   Parameter  können  in  solrconfig.xml  oder  per  Request  angegeben  werden   ! <int  name="rows">10</int>   ! hap://localhost:8983/solr/wiki/select?q=test&rows=10          
  • 34. 34  nionex|  Solr   SearchHandler   Parameter  Typen   ! default:  kann  von  Request  Parameter  überlagert  werden   ! invariants:  nicht  veränderbar   ! appends:  KombinaNon  mit  Request  Parametern   <requestHandler  name="/select"  class="solr.SearchHandler">            <lst  name="defaults“>                  <int  name="rows">10</int>            </lst>   </requestHandler>        
  • 35. 35  nionex|  Solr   ExtendedDisMax  Handler   ! Sehr  robustes  Verhalten  für  Benutzer  Eingaben   ! Google  Syntax     ! Wildcards   ! Lucene-­‐Queries  über  Filterqueries  oder  Boostqueries   ! Filter:  Zeige  nur  Dokumente  vom  Typ  Pdf  an   ! Boost:  Zeige  zuerst  alle  Dokumente  unterhalb  von  /web  an    
  • 36. 36  nionex|  Solr   OpNonen  1:  Basis   <requestHandler  name="/search"...>   ...              <str  name="defType">edismax</str>              <str  name="qf">text  Ntle</str>   ...     name    Urlsegment  des  Handlers   defType    Handlertyp  (ExtendedDisMax)   qf      Feldern  in  denen  gesucht  wird        
  • 37. 37  nionex|  Solr   OpNonen  2:  Filter   <requestHandler  name="/search"...>   ...              <int  name="fq">category:news</int>              <str  name="mm">100%</str>   ...     fq      Filterquery  in  Lucene-­‐Syntax   mm      Minimum  should  match          
  • 38. 38  nionex|  Solr   OpNonen  3:  Rückgabe   <requestHandler  name="/search"...>   ...              <str  name="fl">id  path  Ntle  text  score</str>              <int  name="rows">10</int>   ...     fl      Felder,  die  zurückgegeben  werden   rows    Anzahl  der  zurückgegebenen  Zeilen                              
  • 39. 39  nionex|  Solr   OpNonen  4:  Boost   <requestHandler  name="/search"...>   ...              <str  name="qf">text  Ntle^5</str>              <str  name="pf">text^10  Ntle^50  text_nostem^20  Ntle_nostem^100</str>              <int  name="bq">project:search^20</int>              <str  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11,  2000,1)</str>   ...     pf      Phrase  Fields:  BoosNng  für  passende  Phrasen   bq      Boostquery  in  Lucene-­‐Syntax   bf      BooswuncNon  (Beispiel  Boost  nach  Datum)            
  • 40. 40  nionex|  Solr   Extended  Dismax  Links   Weiterführende  DokumentaNon   ! hap://wiki.apache.org/solr/ExtendedDisMax    
  • 41. 41  nionex|  Solr   SpaNal  Search   ! fq={!geofilt+pt=51.856629,8.310277+sfield=store+d=10}   ! pt  =  Point  =  Ausgangspunkt  für  Suche   ! d  =  Distance  =  max.  Enwernung   ! Doku:  hap://wiki.apache.org/solr/SpaNalSearch     hap://localhost:8983/solr/collecNon1/search?q=entwickler&fq=%7B!geofilt+pt=51.856629,8.310277+sfield=store+d=50%7D}        
  • 42. 42  nionex|  Solr   Facets  -­‐  Parameter    Parameter   Beschreibung   Beispielwerte   facet   AkNvierung   on   facet.field   Angabe  der  Felder   mehrere  Werte  möglich   arNcleYear   facet.sort     SorNerung,  default   Trefferzahl   index  (alphabeNsch)   f.arNcleYear.facet.sort   KonfiguraNon  pro  Feld   Index   facet.mincount   Mindestanzahl  Treffer   3   facet.limit   Maxanzahl  von  Werten   5   facet.offset   Offset  für  Paging   5   facet.prefix   Filter  auf  Werte,  die  mit   angegebenen  String   anfangen  
  • 43. 43  nionex|  Solr   Facets  -­‐  Parameter     Beispiel-­‐Url   ! hap://localhost:8983/solr/be/search_all?q=mohn&   facet=on&   facet.field=arNcleYear&   facet.field=documentType&   f.arNcleYear.facet.sort=index&   facet.limit=2  
  • 44. 44  nionex|  Solr   Facets  -­‐  Filterqueries   ! Filterquery  für  Facetwert  schreiben   ! fq=arNcleYear:2012   ! Problem:  Nur  noch  2012  wird  angezeigt   ! Lösung:  Exclude  Filter  for  Facet     fq={!tag=ay}arNcleYear:2012&facet.field={!ex=ay}arNcleYear      
  • 45. 45  nionex|  Solr   Facets  -­‐  Filterqueries   Problem   ! Filterquery  für  Werte  mit  Sonderzeichen  benöNgen  Escaping   ! Escaping  ist  umständlich  und  fehleranfällig   ! Ein  'Saublöder'  Wert  :)     Lösung   ! Term  QueryParser  für  Filterquery  akNvieren     ! fq={!term  f=documentType}Ein  'Saublöder'  Wert  :)   ! facet.field={!ex=dt}documentType&   fq={!tag=dt  term  f=documentType}  Ein  'Saublöder'  Wert  :)  
  • 46. 46  nionex|  Solr   Facets  -­‐  Ranges   Wann  werden  Ranges  eingesetzt?   ! Felder  mit  Zahlen  oder  Datumswerten   ! Beispiele:   ! Datum   ! Preise   ! =>  Bildung  von  Bereichen      
  • 47. 47  nionex|  Solr   Facets  -­‐  Ranges    Parameter   Beschreibung   Beispielwerte   facet.range   Angabe  der  Felder   mehrere  Werte  möglich     arNcleDate   facet.range.start   Anfangswert   2000-­‐01-­‐01T00:00:00Z   facet.range.end   Endwert   2020-­‐01-­‐01T00:00:00Z   facet.range.gap   Größe  eines  Schriaes   %2B1YEAR   +1YEAR  
  • 48. 48  nionex|  Solr   Facets  -­‐  Ranges     Beispiel-­‐Url:   ! hap://localhost:8983/solr/fs/search_de?   q=*&rows=0&   facet=on&facet.limit=100&   facet.range=arNcleDate&   facet.range.start=2000-­‐01-­‐01T00:00:00Z&   facet.range.end=2020-­‐01-­‐01T00:00:00Z&   facet.range.gap=%2B1YEAR      
  • 49. 49  nionex|  Solr   Facets  -­‐  Queries   Wann  werden  Queries  eingesetzt?   ! Ranges  nicht  flexibel  genug   ! Überschneidende  Bereiche   ! =>  Bereiche  über  Queries  festlegen            wie  der  Name  schon  sagt  J  
  • 50. 50  nionex|  Solr   Facets  -­‐  Queries   Beispiel   ! Letzter  Monat   ! Letzte  6  Monate   ! Letztes  Jahr     ! facet.query=arNcleDate:[NOW-­‐1MONTHS  TO  NOW]   ! facet.query=arNcleDate:[NOW-­‐6MONTHS  TO  NOW]   ! facet.query=arNcleDate:[NOW-­‐1YEARS  TO  NOW]     ! hap://localhost:8983/solr/fs/search_de? q=*&rows=0&facet=on&facet.query=arNcleDate:[NOW-­‐1MONTHS%20TO %20NOW]&facet.query=arNcleDate:[NOW-­‐6MONTHS%20TO %20NOW]&facet.query=arNcleDate:[NOW-­‐1YEARS%20TO%20NOW]  
  • 51. 51  nionex|  Solr   Facets  -­‐  Pivot   ! facet.pivot=documentType,arNcleYear   2010   2011   2012   gesamt   news   2   3   7   12   video   1   2   0   3   project   6   3   4   13   gesamt   9   8   11   28   hap://localhost:8983/solr/be/search_de   ?q=*&rows=0   &facet.pivot=documentType,arNcleYear   &wt=xslt&tr=pivot.xsl          
  • 52. 52  nionex|  Solr   Facets  -­‐  Links   Weiterführende  Links   ! hap://wiki.apache.org/solr/SimpleFacetParameters  
  • 53. 53  nionex|  Solr   AutocompleNon  /  Suggester   Zwei  verschiedene  Lösungsansätze:   ! Facet  Queries   ! Suggester  Komponente  
  • 54. 54  nionex|  Solr   AutocompleNon  /  Suggester   Facet  Queries   ! Normale  Suchanfrage   ! „Face€erung“  nach  allen  Wörtern  im  Volltext   ! Filterung  nach  Prefix    
  • 55. 55  nionex|  Solr   AutocompleNon  /  Suggester   Beispiel  für  AutocompleNon  mit  Facet  Query   hap://localhost:8983/solr/wiki/search? rows=0&facet.field=text&facet.prefix=be&facet.method=enum&facet.limit=10        
  • 56. 56  nionex|  Solr   AutocompleNon  /  Suggester   Suggester  Komponente   ! Empfohlener  Lösungsansatz  für  AutocompleNon  (im  Gegensatz  zu  Facet-­‐Lösung)   ! Extrem  schnell    1  ms   ! Nutzung  der  Solr  Analyse  zur  Normalisierung  (z.B.  Lowercase,  Sonderzeichen)   ! Anzeige  des  Treffers  in  Kontext  (Infix,  Freetext)   ! Fuzzysuche   ! AkNve  Weiterentwicklung    
  • 57. 57  nionex|  Solr   AutocompleNon  /  Suggester   Nachteile   ! Eigener  Index  notwendig   =>  benöNgt  Zeit  beim  Au‹au   ! Keine  Filterung  möglich   Beispielkunde:  ein  Index  für  160  verschiedene  Länder  mit  eigenen   ProduktkombinaNonen  
  • 58. 58  nionex|  Solr   AutocompleNon  /  Suggester   AnalyzingLookupFactory   ! Normalisierung  über  Solr  Analyse  (Lowercase,  AsciiFolding)   ! Anzeige  des  Originalstrings   ! SorNerung  nach  Trefferhäufigkeit    
  • 59. 59  nionex|  Solr   AutocompleNon  /  Suggester   Beispiel  AnalyzingLookupFactory   ! hap://localhost:8983/solr/wiki/suggest?q=amel    
  • 60. 60  nionex|  Solr   AutocompleNon  /  Suggester   FuzzyLookupFactory   ! Normalisierung  über  Solr  Analyse  (Lowercase,  AsciiFolding)   ! Anzeige  des  Originalstrings   ! Fuzzysuche          
  • 61. 61  nionex|  Solr   AutocompleNon  /  Suggester   Beispiel  FuzzyLookupFactory   ! hap://localhost:8983/solr/wiki/suggeswuzzy?q=amelie      
  • 62. 62  nionex|  Solr   AutocompleNon  /  Suggester   Nachteil  –  FuzzyLookupFactory   ! SorNerung  nach  Trefferhäufigkeit   =>  exakte  Treffer  werden  nicht  immer  als  erstes  angezeigt   haps://issues.apache.org/jira/browse/LUCENE-­‐5172   ! =>  Lösung  KombinaNon  aus  normaler  und  Fuzzysuche          
  • 63. 63  nionex|  Solr   AutocompleNon  /  Suggester   AnalyzingInfixLookupFactory   ! Normalisierung  über  Solr  Analyse  (Lowercase,  AsciiFolding)   ! Anzeige  des  Originalstrings   ! SorNerung  nach  Trefferhäufigkeit   ! Anzeige  des  gesamten  Felder  mit  Highligh,ng  des  Treffers   ! =>  Nur  für  kurze  Felder  (z.B.  Produktnamen)  geeignet    
  • 64. 64  nionex|  Solr   AutocompleNon  /  Suggester   Beispiel  AnalyzingInfixLookupFactory   ! hap://localhost:8983/solr/collecNon1/suggesNnfix?q=mei    
  • 65. 65  nionex|  Solr   Zusammenfassung  /  Gegenüberstellung  Suggester   Feature   Face,ng   Suggester   Anzeige   analysierter  Text   =>  Kein  Stemming   Originaltext   Infix  mit  Highligh,ng   Performanz   nur  bis  miaelgroße  Indexes   facet.method=enum   sehr  schnell   Suche   Normalisierung  notwendig   Suche  über  Analyzer  Chain   Fuzzy  möglich   Filter   Filterqueries  möglich   Keine  Filter  möglich   ggf.  per  Prefix  =>  Aufwand!   Index   Solr  Index   Eigener  Index  
  • 66. 66  nionex|  Solr   HightlighNng               Parameter  für  Handler   Beschreibung   Beispielwerte   hl   AkNvierung  HighlighNng   true   hl.fl   Liste  der  Felder   Felder  müssen  stored  sein   Ntle_nostem  text_nostem   hl.snippets   Anzahl  der  angezeigten   Stellen   5  
  • 67. 67  nionex|  Solr   HightlighNng   OpNonen  für  HighlighNng  Komponente   ! Größe  der  Fragmente   ! HTML-­‐Tags   ! Berechnung  der  Fragment  Grenzen  
  • 68. 68  nionex|  Solr   Spellchecker   ! Korrektur  des  Suchbegriffes  anhand  des  Indexes   ! hap://localhost:8983/solr/be/search_de?q=mispellt      
  • 69. 69  nionex|  Solr   Joins   ! Join  Beispiel   ! SELECT  *  FROM  solr  WHERE  links  IN  (SELECT  id  FROM  solr  where  Ntle=  "iPad1")   =>  Ergebnis:  Markus     id   ,tle   links   ipad1   iPad1   ipad2   iPad2   ipad3   iPad3   user1   Markus   ipad1   user2   Thorsten   ipad3  
  • 70. 70  nionex|  Solr   Joins   ! Join  über  links=id  mit  Constraint  Ntle=iPad1   ! q={!join  from=id  to=links}Ntle:iPad1   ! Auf  Werte  aus  innerer  Abfrage  kann  nicht  zugegriffen  werden.   ! Join  über  mehrere  Cores  möglich,  wenn  gleiche  VM:   {!join  from=path  to=links  fromIndex=fs}Ntle:iPad1   ! hap://localhost:8983/solr/collecNon1/search?fl=*&q={!join+from=id+to=links} Ntle:iPad1   ! hap://localhost:8983/solr/collecNon1/search?fl=*&q={!join+from=path+to=links +fromIndex=fs}Ntle:iPad1      
  • 71. 71  nionex|  Solr   MoreLikeThis   ! Suche  ähnlicher  Dokumente   ! UseCase:  Suche  in  Intranet  nach  Dubleaen   ! hap://localhost:8983/solr/collecNon1/select? q=id:mlt1&mlt=true&mlt.fl=includes&mlt.mindf=1&mlt.minw=1&fl=id,includes,score    
  • 73. 73  nionex|  Solr   BoosNng   ! Häufigkeit  des  Treffers  vs.  Länge  des  Dokumentes  (Standard)   ! Unterschiedliche  Gewichtung  von  einzelnen  Feldern   Titel  wichNger  als  Beschreibungstext   ! Exakter  Treffer  vs.  Treffer  mit  Stemming     ! Höhere  Gewichtung  von  Phrasen   Beispiel:  Suche  nach  „Reinhard  Mohn“   ! Gewichtung  nach  beliebigen  Kriterien;  Beispiele:   ! Alter   ! Kategorie  „WichNg“   ! Dokumenayp      
  • 74. 74  nionex|  Solr   BoosNng   <requestHandler  name="/search"...>   ...              <str  name="qf">text  Ntle^5</str>              <str  name="pf">text^10  Ntle^50  text_nostem^20  Ntle_nostem^100</str>              <int  name="bq">project:search^20</int>              <str  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11,  2000,1)</str>   ...     pf      Phrase  Fields:  BoosNng  für  passende  Phrasen   bq      Boostquery  in  Lucene-­‐Syntax   bf      BooswuncNon  (Beispiel  Boost  nach  Datum)      
  • 75. 75  nionex|  Solr   QueryFuncNon   <str  name="bf">recip(ms(NOW,arNcleDate),3.16e-­‐11  2000,1)</str>   ! BoosNng  abhängig  vom  Datum   ! Aktuelles  Datum  =>  Hohe  Relevanz   ! Differenz  in  aktuellem  Datum   =>  Starke  Beeinflussung   ! Differenz  in  aktuellem  Datum   =>  schwache  Beeinflussung   ! Sparsam  einsetzen,   da  performanz-­‐  und  speicherintensiv    
  • 76. 76  nionex|  Solr   BoosNng  Bemaßung   ! Boost-­‐Parameter  fließen  als  Faktoren  in  die  Berechnung  des  Scores  ein   ! Lineare  Reihe  =>  Zu  geringer  Unterschied:   text^10  Ntle^20  text_nostem^30  Ntle_nostem^40   ! =>  Empfehlung  1:  ExponenNelle  Reihe:   10,  20,  50,  100,  200,  1000     ! =>  Empfehlung  2:  Ausprobieren  ;-­‐)     ! =>  Empfehlung  3:  Berechnung  analysieren  (schmerzhax)      
  • 77. 77  nionex|  Solr   ! Indizierung  deutsche  Wikipedia  16  GB  XML   ! Einfache  ungecachte  Suchanfrage  20-­‐40ms   ! Gecachte  (gleiche)  einfache  Suchanfragen  1000  Requests  pro  Sekunde   Skalierbarkeit  
  • 78. 78  nionex|  Solr   ! Viel  Schreiblast   ! Nach  jedem  Commit  =>  neuer  Searcher  =>  Caches  neu  au‹auen!     ! =>  verschiedene  Lösungsansätze  in  Solr/Lucene4   ! =>  SNchwort  NearRealTime  (NRT)   Skalierbarkeit  -­‐  Probleme  
  • 79. 79  nionex|  Solr   DokumentaNon   ! Pdf  Reference  Guide   hap://lucene.apache.org/solr/documentaNon.html   ! Solr  Wiki  (Hier  landet  man  immer  per  Google)   hap://wiki.apache.org/solr  
  • 80. Fragen?      
  • 81. Für  Fragen  stehen  wir  Ihnen  gerne  zur  Verfügung!   Kontaktdaten   81   Markus  Reinsch   Soxware  Architect     E-­‐Mail      markus.reinsch@bertelsmann.de    |    www.nionex.de     Ein  Unternehmen  der  Bertelsmann  SE  &  Co.  KGaA