SummaRise konfiguration
Contents
Indledning
SummaRise giver mulighed for at de enkelte biblioteker har markant indlfydelse på opsætning af deres del af systemet. Primært omhandler denne opsætning gruppering, rankering og facetter. Alle tre dele kan kontrolleres gennem en enkelt opsætningsfil der kaldes IndexDescriptor. Der er yderligere mulighed for mere ad-hoc justeringer af rankering og facetter gennem det almindelige adgangs-API, men det forventes at dette vil blive brugt til eksperimentering snarere end produktion.
SummaRise anvender som udgangspunkt statistikbaseret rankering ved sortering af søgeresultaterne. Der findes en glimrende engelsk introduktion til emnet på http://infomotions.com/blog/2009/04/tfidf-in-libraries-part-i-for-librarians/
IndexDescriptor
Beskrivelsen af IndexDescriptor holdes her på et forholdsvis ikke-teknisk niveau og er ikke udtømmende. For de der vil have detaljer kan XML Schemas for IndexDescriptor findes i Summa Subversion repository. Besøg http://wiki.statsbiblioteket.dk/summa for information om dette. En konkret IndexDescriptor, der anvendes til Odense folkebibliotek, er IndexDescriptor_sample.xml
Nedenfor vises et eksempel på en IndexDescriptor. Der er taget udgangspunkt i praksisregler for søgeveje, men en masse groups og fields er fjernet for at gøre det overskueligt. De enkelte dele vil blive gennemgået efter eksemplet.
<?xml version="1.0" encoding="UTF-8"?>
<IndexDescriptor version="1.0" xmlns="http://statsbiblioteket.dk/summa/2008/IndexDescriptor">
<groups>
<group name="ti">
<field ref="ht"/>
<field ref="se"/>
<field ref="titel"/>
</group>
<group name="fo">
<alias name="forfatter"/>
<alias name="kunstner"/>
<field ref="ko"/>
<field ref="pe"/>
<field ref="po"/>
</group>
<group name="lfo">
<alias name="forfatternavn"/>
<alias name="kunstnernavn"/>
<field ref="lko"/>
<field ref="lpe"/>
<field ref="lpo"/>
</group>
</groups>
<fields>
<field name="ht" parent="text" multiValued="true" queryBoost="2"/>
<field name="se" parent="text" multiValued="true" queryBoost="2"/>
<field name="titel" parent="text" multiValued="true" queryBoost="2"/>
<field name="ko" parent="text" multiValued="true"/>
<field name="pe" parent="text" multiValued="true"/>
<field name="po" parent="text" multiValued="true"/>
<field name="lko" parent="keyword" multiValued="true"/>
<field name="lpe" parent="keyword" multiValued="true"/>
<field name="lpo" parent="keyword" multiValued="true"/>
<field name="id" parent="number" multiValued="true" inFreeText="true">
<alias name="identifier"/>
</field>
<field name="ldb" parent="keyword" inFreeText="true"/>
<field name="cluster" parent="keyword">
<alias name="klynge" lang="da"/>
</field>
<field name="stregkode" parent="text" multiValued="true" inFreeText="true"/>
<field name="år" parent="text" multiValued="true" inFreeText="true"/>
<field name="diverse" parent="text" multiValued="true" inFreeText="true" queryBoost="0.5"/>
<field name="shortformat" parent="stored"/>
</fields>
<defaultLanguage>da</defaultLanguage>
<defaultSearchFields>
<field ref="ti"/>
<field ref="fo"/>
<field ref="freetext"/>
<field ref="år"/>
<field ref="diverse"/>
</defaultSearchFields>
<QueryParser defaultOperator="AND"/>
<facets xmlns="http://statsbiblioteket.dk/summa/2009/FacetIndexDescriptor">
<facet ref="lfo" name="Forfattere"/>
<facet ref="ldb" name="Emner"/>
<facet ref="cluster" name="Klynger" maxTags="4" defaultTags="20" sort="ALPHA" sortLocale="da"/>
</facets>
</IndexDescriptor>
Grupperinger
<groups>
<group name="ti">
<field ref="ht"/>
<field ref="se"/>
<field ref="titel"/>
</group>
<group name="fo">
<alias name="forfatter"/>
<alias name="kunstner"/>
<field ref="ko"/>
<field ref="pe"/>
<field ref="po"/>
</group>
<group name="lfo">
<alias name="forfatternavn"/>
<alias name="kunstnernavn"/>
<field ref="lko"/>
<field ref="lpe"/>
<field ref="lpo"/>
</group>
</groups>Grupperinger er relevante for specifikke søgninger og for facetter. En group består af en liste af fields. Søges der specifikt på en gruppe med f.eks. fo:"Hans Christian Andersen" vil dette overordnet svare til en søgning på (ko:"Hans Christian Andersen" OR pe:"Hans Christian Andersen" OR po:"Hans Christian Andersen"). En gruppe kan anvendes som facet. Se afsnittet om facetter for detaljer om dette.
alias er, som navnet angiver, et alias for gruppen. En søgning på forfatter:"Astrid Lindgren" vil give præcis det samme resultat som en søgning på fo:"Astrid Lindgren". En gruppe kan have mere end ét alias.
Felter
<fields>
<field name="ht" parent="text" multiValued="true" queryBoost="2"/>
<field name="se" parent="text" multiValued="true" queryBoost="2"/>
<field name="titel" parent="text" multiValued="true" queryBoost="2"/>
<field name="ko" parent="text" multiValued="true"/>
<field name="pe" parent="text" multiValued="true"/>
<field name="po" parent="text" multiValued="true"/>
<field name="lko" parent="keyword" multiValued="true"/>
<field name="lpe" parent="keyword" multiValued="true"/>
<field name="lpo" parent="keyword" multiValued="true"/>
<field name="id" parent="number" multiValued="true" inFreeText="true">
<alias name="identifier"/>
</field>
<field name="ldb" parent="keyword" inFreeText="true"/>
<field name="cluster" parent="keyword">
<alias name="klynge" lang="da"/>
</field>
<field name="stregkode" parent="text" multiValued="true" inFreeText="true"/>
<field name="år" parent="text" multiValued="true" inFreeText="true"/>
<field name="beskrivelse" parent="text" multiValued="true" inFreeText="true" queryBoost="0.5"/>
<field name="shortformat" parent="stored"/>
</fields>Et dokument består grundliggende af en række felter. Her er det kun alias, inFreeText og queryBoost der vil blive beskrevet. Der henvises til klassen IndexField og til XML Schema IndexDescriptor.xsd fra Summa projektet for detaljer.
alias fungerer på samme vis som for grupper: Ved en forespørgsel er aliaset ækvivalent med feltnavnet.
inFreeText angiver at indholdet af feltet skal kopieres til det særlige felt freetext. freetext bliver derved en lang række af ord fra dokumentet og anvendes som generelt søgefelt. De fleste felter vil enten optræde i defaultSearchFields eller have inFreeText sat til true.
queryBoost definerer vægten af feltet. Den basale værdi er 1.0. Sættes værdien højere end dette, vil feltet få større vægt end normalt. Omvendt kan vægten blive mindre end normalt ved at vælge et tal under 1.0. Dette demonstreres lettest med et eksempel:
I korpus er der bl.a. tre dokumenter der indeholder termerne "hans", "christian" og "andersen":
- Invasive arter og GMO'er : nye trusler mod naturen (hvor navnene "Hans J. Baagøe", "Christian Coff" og "John Holten Andersen" indgår i beskrivelsen af bogen)
- Den grimme ælling (forfatter Hans Christian Andersen)
- Hans Christian Andersen : The story of his life and work 1805-75 (forfatter Elias Bredsdorff)
Der laves en søgning på "hans christian andersen". Søgningen resulterer i de tre dokumenter ovenfor.
Ved første dokument genfindes søgestrengen i beskrivelsen af bogen. Beskrivelsen er lagt i feltet beskrivelse der har vægten 0.5.
Ved andet dokument genfindes søgestrengen i forfatterfeltet pe der har vægten 2.0.
Ved tredje dokument genfindes søgestrengen i titelfeltet titel der har basisvægten 1.0.
Når den samlede rankeringsværdi for de tre dokumenter udregnes, vil deres værdi blive ganget med faktorerne 0.5, 2.0 og 1.0 for henholdsvis dokument 1, 2 og 3. Som udgangspunkt vil man derfor forvente at rækkefølgen bliver
- Den grimme ælling (forfatter Hans Christian Andersen)
- Hans Christian Andersen : The story of his life and work 1805-75 (forfatter Elias Bredsdorff)
- Invasive arter og GMO'er : nye trusler mod naturen (hvor navnene "Hans J. Baagøe", "Christian Coff" og "John Holten Andersen" indgår i beskrivelsen af bogen)
Dette er dog ikke garanteret, jvf. artiklen om statistikbaseret rankering.
Primære søgefelter
<defaultSearchFields>
<field ref="ti"/>
<field ref="fo"/>
<field ref="freetext"/>
<field ref="år"/>
<field ref="diverse"/>
</defaultSearchFields>Søgninger kan være kvalificerede søgninger eller fritekstsøgninger.
Kvalificerede søgninger angives med gruppe- eller feltnavnet foran søgestrengen, f.eks. titel:"den grimme ælling". Herved afgrænses søgningen til den gruppe eller det felt der angives.
Fritekstsøgninger udfoldes til de felter og grupper der angives i defaultSearchFields. En søgning på hest vil derfor være ækvivalent med ti:hest OR fo:hest OR freetext:hest OR år:hest or diverse:hest. Logfiler på Statsbiblioteket angiver at langt de fleste indledende søgninger er fritekstsøgninger.
AND eller OR?
<QueryParser defaultOperator="AND"/>
Ved søgninger kan der eksplicit angivet AND/OR, f.eks. (ti:"hest" OR ti:"pony") AND pasning. Såfremt der ikke angives eksplicit boolsk logik, anvendes defaultOperator. I ovenstående IndexDescriptor vil en søgning på hans christian andersen altså blive til hans AND christian AND andersen.
Det bør her nævnes at de fleste store søgemaskiner på Internettet anvender AND som udgangspunkt. Det er vor opfattelse at i hvert fald europæiske brugere har en klar forventning om dette og at de derfor angiver flere søgetermer når de vil indsnævre en søgning.
Facetter
<facets xmlns="http://statsbiblioteket.dk/summa/2009/FacetIndexDescriptor">
<facet ref="lfo" name="Forfattere"/>
<facet ref="ldb" name="Emner"/>
<facet ref="cluster" name="Klynger" maxTags="4" defaultTags="20" sort="ALPHA" sortLocale="da"/>
</facets>Facetter vises som hovedregel i form af lister i venstre eller højre side af en søgegrænseflade. Afhængigt af grænsefladen kan de anvendes til at udvide eller indsnævre den aktuelle søgning. I IndexDescriptor angives facetter som en liste af referencer til grupper eller felter. En søgning på "den grimme ælling" kan f.eks. give facetterne
- Forfattere
- elung jensen søren (608)
- bjørn agnethe (253)
- andersen h c 1805 (218)
- møller troels 1945 (209)
- elung tacha (185)
- Emner
- kærlighed (143)
- spændende bøger (136)
- eventyr (120)
- kriminalromaner (101)
- danmark (98)
- Klynger
- andefugle (1)
- diskurs (210)
- forfattere (3402)
- ællinger (12)
Indholdet af facetterne kaldes tags. Tallet ud fra hvert enkelt tag angiver det antal dokumenter i søgningen der har en gruppe eller felt der indeholder det pågældende tag. Tags sorteres som udgangspunkt efter antal forekomster (POPULARITY), men kan sorteres alfabetisk (ALPHA). Ved alfabetisk sortering bør der angives hvilke regler der anvendes. Dette gøres med sortLocale, hvor den oplagte værdi i Danmark er da.
Antallet af viste tags kan justeres gennem forespørgslen. Basisværdierne angives med defaultTags (antallet af tags der skal udtrækkes, medmindre andet angives) og maxTags (det maksimale antal tags der kan udtrækkes).
name er det konceptuelle navn for facetten. Såfremt intet angives, vil gruppe- eller feltnavnet blive anvendt.
Frasesøgninger
Frasesøgninger foretages ved at sætte søgetermerne i anførselstegn: "knud jensen".
Som udgangspunkt er frasesøgninger ordrette. Med ovenstående eksempel er det kun poster hvor termen "knud" følges direkte af "jensen" der vil blive fundet. Det er muligt at slække på kriterierne ved at angive at afstanden (slope) mellem termerne må være højere: "knud jensen"~1 angiver at der kan være en ekstra term mellem "knud" og "jensen", så poster med forfatteren "Knud Peder Jensen" er gyldige.
En anelse ikke-intuitivt skal slope sættes til 2 for at tillade ombytning af termerne. Logikken er at den første term skal flyttes oven i det andet, hvorefter den anden skal flyttes på den anden side af det første. "knud jensen"~2 vil altså matche "Jensen Knud" og "Knud Østerby Faderskov Jensen".
Ved frasesøgninger vil korte afstande blive vægtet højere end lange, så ved ovenstående vil poster med forfatteren "Knud Jensen" alt andet lige bliver prioriteret over poster med forfatteren "Knud Østerby Faderskov Jensen".
Rankering
Som det fremgår af afsnittet #Felter kan vægten af de enkelte felter justeres. Dette er en ikke-triviel process, da det kræver genstart af den underliggende søgemaskine. Imidlertid er det forholdsvis simpelt at eksperimentere med justering af rankering gennen almindelige forespørgsler. Syntaksen er almindelig søgning boost(feltnavnA^boost feltnavnB^boost). Vægtangivelser for felter vil blive multipliceret med de eksisterende vægte fra IndexDescriptor.
Eksempel: Der søges efter hans christian andersen, men mange dokumenter med "Hans Christian Andersen" i titlen kommer øverst. For at kompensere øges vægten for forfatter med hans christian andersen boost(fo^2.0).
Når passende boosts er defineret kan IndexDescriptor opdateres ved at tage de eksisterende boosts i IndexDescriptor og gange med de nye boosts.
Hvis man vil arbejde med justering af rankering, kan man i søgefeltet på eksempelsitet angive <:explain:> foran ens søgning. Dette resulterer i en detaljeret redegørelse for hvilke vægte de enkelte dele af resultatet har haft. Med eksemplet ovenfor vil en søgning blive til <:explain:>hans christian andersen boost(fo^2.0), hvilket kan ses på http://test.summarise.dk/silkeborg/index.jsp?query=<%3Aexplain%3A>hans+christian+andersen+boost(fo^2.0)
Ekspansion
Den første del af forklaringen er den umiddelbare ekspansion af ens søgeudtryk:
( +(au:hans[1.0] lfo:hans[1.0] titel:hans[1.0] ltitel:hans[1.0]
<uk:hans[1.0] ke:hans[1.0] au:hans[1.0]>
<ht:hans[1.0] titel:hans[1.0] se:hans[1.0]>
<dt:hans[1.0] fm:hans[1.0] df:hans[1.0] nb:hans[1.0] me:hans[1.0] ds:hans[1.0]>
<pe:hans^2.0[2.0] ko:hans^2.0[2.0] po:hans^2.0[2.0]>
ma_lang:hans[1.0] freetext:hans[1.0] sort_title:hans[1.0])
+(au:christian[1.0] lfo:christian[1.0] titel:christian[1.0] ltitel:christian[1.0]
<uk:christian[1.0] ke:christian[1.0] au:christian[1.0]>
<ht:christian[1.0] titel:christian[1.0] se:christian[1.0]>
<dt:christian[1.0] fm:christian[1.0] df:christian[1.0] nb:christian[1.0] me:christian[1.0] ds:christian[1.0]>
<pe:christian^2.0[2.0] ko:christian^2.0[2.0] po:christian^2.0[2.0]>
ma_lang:christian[1.0] freetext:christian[1.0] sort_title:christian[1.0])
+(au:andersen[1.0] lfo:andersen[1.0] titel:andersen[1.0] ltitel:andersen[1.0]
<uk:andersen[1.0] ke:andersen[1.0] au:andersen[1.0]>
<ht:andersen[1.0] titel:andersen[1.0] se:andersen[1.0]>
<dt:andersen[1.0] fm:andersen[1.0] df:andersen[1.0] nb:andersen[1.0] me:andersen[1.0] ds:andersen[1.0]>
<pe:andersen^2.0[2.0] ko:andersen^2.0[2.0] po:andersen^2.0[2.0]>
ma_lang:andersen[1.0] freetext:andersen[1.0] sort_title:andersen[1.0])
)Det virker uoverskueligt, men principperne er forholdsvis enkle: Både almindelige paranteser og <> angiver at mindst én af betingelserne skal være opfyldt. Ved () summeres vægtene fra hver opfyldt betingelse, mens den største vægt anvendes fra <>. Dette reflekterer felter og grupper fra de primære søgefelter, hvor betingelsen med den største vægt anvendes ved grupper.
Et mindre eksempel er på sin plads her. Lad os sige vi har en IndexDescriptor der bl.a. indeholder følgende:
<group name="fo">
<alias name="forfatter"/>
<alias name="kunstner"/>
<field ref="ko"/>
<field ref="pe"/>
<field ref="po"/>
</group>
...
<field name="titel" parent="text" multiValued="true"/>
...
<defaultSearchFields>
<field ref="fo"/>
<field ref="titel"/>
...
</defaultSearchFields>vi foretager en søgning på "hans jensen", hvilket giver
( +(<ko:hans[1.0] pe:hans[1.0] po:hans[1.0]>
titel:hans[1.0])
+(<ko:jensen[1.0] pe:jensen[1.0] po:jensen[1.0]>
titel:jensen[1.0])
)Det fremgår af + foran to af paranteserne a både
+(<ko:hans[1.0] pe:hans[1.0] po:hans[1.0]>
titel:hans[1.0])og
+(<ko:jensen[1.0] pe:jensen[1.0] po:jensen[1.0]>
titel:jensen[1.0])opfyldes.
Ser vi på den første del, fremgår det at der er to betingelser. Den første er
<ko:hans[1.0] pe:hans[1.0] po:hans[1.0]>
hvor "hans" skal optræde i mindst et af felterne ko, pe og po. Hvis "hans" optræder i flere af felterne benyttes vægten fra det match der giver højest værdi (se indledningen om statistikbaseret rankering for en forklaring på hvordan de konkrete værdier udregnes).
Anden betingelse er
titel:hans[1.0]
Hvis både første og anden betingelse er opfyldt summeres deres værdier. Hvis kun én af betingelserne er opfyldt, benyttes værdien herfra.
Score
Under afsnittet om ekspansion ses Score (se eksemplet http://test.summarise.dk/silkeborg/index.jsp?query=<%3Aexplain%3A>hans+christian+andersen+boost(fo^2.0)). Som med ekspansion er det mere overskueligt at præsentere et nedkogt eksempel. Med udgangspunkt i en IndexDescriptor med
<group name="fo">
<alias name="forfatter"/>
<alias name="kunstner"/>
<field ref="ko"/>
<field ref="pe"/>
<field ref="po"/>
</group>
...
<field name="titel" parent="text" multiValued="true"/>
...
<defaultSearchFields>
<field ref="fo"/>
<field ref="titel"/>
...
</defaultSearchFields>og en søgning på <:explain:>hans christian andersen boost(fo^2) kunne et resultat se således ud:
2.361722 = (MATCH) sum of:
0.40911254 = (MATCH) max of:
0.16427146 = (MATCH) weight(pe:andersen^2.0 in 69144), product of:
0.13500366 = queryWeight(pe:andersen^2.0), product of:
2.0 = boost
4.588813 = idf(docFreq=3856, numDocs=139589)
0.014710085 = queryNorm
1.2167927 = (MATCH) fieldWeight(pe:andersen in 69144), product of:
1.4142135 = tf(termFreq(pe:andersen)=2)
4.588813 = idf(docFreq=3856, numDocs=139589)
0.1875 = fieldNorm(field=pe, doc=69144)
0.40911254 = (MATCH) weight(po:andersen^2.0 in 69144), product of:
0.16502947 = queryWeight(po:andersen^2.0), product of:
2.0 = boost
5.609399 = idf(docFreq=1389, numDocs=139589)
0.014710085 = queryNorm
2.4790273 = (MATCH) fieldWeight(po:andersen in 69144), product of:
1.4142135 = tf(termFreq(po:andersen)=2)
5.609399 = idf(docFreq=1389, numDocs=139589)
0.3125 = fieldNorm(field=po, doc=69144)
0.12823682 = (MATCH) weight(titel:hans in 69144), product of:
0.07769426 = queryWeight(titel:hans), product of:
5.2817006 = idf(docFreq=1928, numDocs=139589)
0.014710085 = queryNorm
1.6505314 = (MATCH) fieldWeight(titel:hans in 69144), product of:
1.0 = tf(termFreq(titel:hans)=1)
5.2817006 = idf(docFreq=1928, numDocs=139589)
0.3125 = fieldNorm(field=titel, doc=69144)Den totale score for dokumentet er 0.53734936 og er summen af scores for match på gruppen fo og feltet titel.
Scoren for gruppen fo er 0.40911254 og er maksimum af match på gruppe-felterne ko, pe og po.
Scoren for ko er ikke-eksisterende, da der ikke er noget match.
Scoren for pe er 0.16427146 og er udregnet som beskrevet i statistikbaseret rankering i indledningen. Det er værd at bemærke faktoren 2.0 = boost, der skyldes den eksplicitte angivelse af boost i forespørgslen.
Scoren for po er 0.40911254 og er udregnet som for pe. 0.40911254 er højere end 0.16427146 og anvendes derfor som den samlede score for gruppen fo.
Scoren for feltet titel er 0.12823682, udregnet som pe og po. Bemærk at der ikke er noget eksplicit boost. Den implicitte boost-faktor er 1.0.
