Dagen@ifi Hvordan fungerer en søkemotor … og hvorfor lager vi det ikke selv? Helge Jenssen, søkearkitekt FINN.no
Jun 23, 2015
Dagen@ifi
Hvordan fungerer en søkemotor… og hvorfor lager vi det ikke selv?
Helge Jenssen, søkearkitekt FINN.no
SøkemotorDokumentbasert indeks av data fra ulike kilder
Egenskaper:• Fritekst• Relevans• Fasetter• Dokumenter• Indeks - denormalisert / uten relasjoner
Søkemotor – Apache SolrIndeksering Søk
Struktur
• Dokument er enheten som blir lagret i indeksen• Dokument består av felter• Felter har sin egen konfigurasjon
– Type – Hvilken type feltet er (int, string, egne typer) – Stored – Om innholdet kan returneres (true|false)– Indexed – Om innholdet kan søkes/filtreres/sorteres på
(true|false)– Multivalue – Om det er lov med flere verdier (true|false)– Analyse – Hvordan innholdet skal håndteres ved
indeksering og søk
Eksempel på dokument
UpdateRequestHandler
UpdateRequestHandler
• Input stream -> Tekst/innhold
UpdateChain
UpdateChain
• Prosessering pr dokument• Endre basert på flere felter• Legge til felt
0316 Oslo
Analysis
Analyse ved indeksering
• Analyse kjøres pr felt• Felttype definerer liste med analyse-steg
• Kan overstyres på feltnivå
Tokeinzer
”To stoler til salgs i Oslo”
Tittel
[To, stoler, til, salgs, i, Oslo]
Tittel
LowerC
ase
[to, stoler, til, salgs, i,
oslo]
Tittel
Stem
ming
[to, stol, til, salg, i, oslo]
Tittel
Eksempel på felttype med analysekonfigurasjonA
na
lyse
ve
d
ind
eks
erin
gA
na
lyse
ve
d
søk
Eksempler på analyse
• CharFilterFactories (normalisere aksent-er og umlaut-er) – é e, ö o, å a
• WhitespaceTokenizer - dele opp i ord/tokens– Dette er en test Dette, er, en, test
• Pr token– Lowercase
• Dette dette
– Synonym• Sovesofa sofa
– Stoppord• Fjerner ord uten mening
– Ordsplitting • Tex-Mex|TexMex Tex Mex
– Stemming/lemmatisering• Gule gul, biler bil
Eksempel på stemmer (NorwegianMinimalStemmer)
husa-> hus
husene-> hus
huset -> hus
Indexing - en invertert index
Dokumenter Dokumentene er indeksertId Innhold
1 To stoler til salgs i Oslo
2 Sofa til salgs
3 Antikk stol til salgs
4 Et bord og fire stoler kjøpes
5 Sofa
Term Document
til 1, 2, 3
salg 1, 2, 3
stol 1, 2, 4
sofa 2, 5
i 1
oslo 1
to 1
antikk 3
fire 4
kjøpe 4
Skriver segment til disk
• Eget (binært) format
Søk
Søk
• Analyse– Samme som ved indeksering
• Query– Filtrerer og brukes for å regne ut
relevans
[to, stol, til, salg, i, oslo]
Tittel
Indeks
Tokeinzer
”Stol Oslo”
Query
[Stol, Oslo]
QueryLow
erCase
[stol, oslo]
Query
Stem
ming
[stol, oslo]
Query
Relevans
• Relevans er et tall som beskriver hvor godt dokumentet passer søket
• Relvans er satt sammen av en– Dynamisk faktor– Statisk faktor– Rankbidrag basert på funksjoner
Relevans
• Statisk boost– Viktige/bedre dokument kan
rankes høyere uavhengig av hva man søker på
• Function queries– Boost på dato i forhold til
dagens dato (freshness)– Boost på avstand fra et
punkt (geodistance)
• Dynamisk rank – TF * IDF
• Term frequency (TF)sqrt(freq)
• Inverse Document Frequency (IDF)log(numDocs/(freq +1))
– Position• Hvor tidlig i feltet det står
”sofa selges” > ”selger sofa”
– QueryNorm• Hvor stor andel av feltet
”sofa” > ”sofa til salgs”
Dynamisk rank = Term frequency * Inverse document freqency
Dokumenter Dokumentene er indeksert
stol log(5/(3 + 1)) = 0,10 < sofa log(5/(2 + 1)) = 0,22
Id Innhold
1 To stoler til salgs i Oslo
2 Sofa til salgs
3 Antikk stol til salgs
4 Et bord og fire stoler kjøpes
5 Sofa
Term Document IDF
til 1, 2, 3 3/5
salg 1, 2, 3 3/5
stol 1, 2, 4 3/5
sofa 2, 5 2/5
i 1 1/5
oslo 1 1/5
to 1 1/5
antikk 3 1/5
fire 4 1/5
kjøpe 4 1/5
SearchComponents
SearchComponents
• Komponenter man kan legge på i ”pipeline” for å endre resultatsettet.
• Eksempler– FacetComponent
• Dele opp søkeresultat i katergorier med antall i hver kategori
– MoreLikeThis• Finne andre som ligner
– Highlighting• Markere søkeordtreff i resultatet
– StatsComponent• Regne ut statistikker for resultatsettet
– QueryElevationComponent • ”heve” resultater i resultatsettet basert på regler og ikke relevans
Fasetter
• Dele opp søkeresultat i katergorier med antall i hver kategori
Highlight
ResponseWriter
ResponseWriter
• Bestemmer format på responsen• Eksempler
– Xml (default)– Json– CSV– Ruby
Dagen@ifi
Hvordan fungerer en søkemotor… og hvorfor lager vi det ikke selv?
Helge Jenssen, søkearkitekt FINN.no