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"}
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
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
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
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
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
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]
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
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
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
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
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