Skip to main content

solr

Dokumentkilde og status

Følgende side er kopiert fra confluence 16.06.2026. Den var sist endret i confluence i 2023.

Beskrivelser av felter ble gjort om til tabell for readability.

Indeksering

Søket i kartkatalogen er implementert ved hjelp av Apache Solr. Datagrunnlaget hentes fra GeoNetwork som benyttes som database for ISO19139 XML-filene som beskriver de ulike datasettene, tjenestene og applikasjonene.

Indeksering

Kartkatalogen eksponerer API-metoder for å kjøre indeksering av Solr. Indeksering kan kjøres manuelt eller trigges via en oppdatering av metadata i GeoNetwork.

API-metoder for indeksering

URLBeskrivelseEksempel
/api/metadataupdatedIndekserer en metadata XML-fil.http://kartkatalog.dev.geonorge.no/api/metadataupdated
/api/index-metadataIndekserer alle metadata som finnes i GeoNetwork.http://kartkatalog.dev.geonorge.no/api/index-metadata
/api/reindex-metadataReindekserer alle metadata som finnes i GeoNetwork. Til forskjell fra Index så slettes hele indeksen før ny indeksering starter.http://kartkatalog.dev.geonorge.no/api/reindex-metadata

Beskrivelse av indekseringsoperasjonen

Indekseringsmotoren i Kartkatalogen fungerer på følgende måte:

Ved hjelp av GeonorgeAPI kjøres det et tomt CSW-søk mot GeoNetwork.

Søket kjøres i batcher på 50 metadata om gangen. Det returneres store XMLer (ISO19139) som gjør at det ikke er hensiktsmessig å kjøre veldig store batcher.

SolrIndexDocumentCreator sørger for å generere indekseringsdokumenter. Se listen nedenfor for alle feltene som blir indeksert.

Mange av feltene kopieres til 3 samlefelter: allText, allText2, allText3. Se liste nedenfor for hvilke felter dette gjelder og hvor de kopieres.

Beskrivelse av søkeoperasjonen

Søk justeres eng gang i blant, se metoden BuildQuery i filen: https://github.com/kartverket/Geonorge.Kartkatalog/blob/master/Kartverket.Metadatakatalog/Models/SearchParameters.cs

Spesialtegn fjernes fra søketeksten: : '+', '-', '&', '|', '!', '(', ')', ', ', '[', ']', '^', '"', '~', '*', '?', ':', '\', '/'

Boost-regler

1. Leksikalsk boost-stige (hovedspørringen)

Klausulene er ordnet etter spesifisitet — mest presise treff får høyest boost. Merk mønsteret (type:dataset AND …)^N …^(N-1): datasett får alltid +1 over andre typer (tjenester, WMS/WFS osv.).

BoostKlausulBetyr
^81uuid:<tekst>Eksakt UUID-treff — vinner alt
^79 / ^78titleText:<tekst>Eksakt tittel (hele frasen, ingen wildcard)
^77 / ^76titleText:<tekst>*Tittel starter med søket (prefiks)
^75 / ^74title_lowercase:*<tekst>* (+ prefiks)Tittel inneholder søket (case-uavhengig)
^71 / ^70allText:*<tekst>*Fulltekst inneholder søket (substring)
^0.5 / ^0.4per ord: titleText:*ord*Ved flerordssøk: hvert ord for seg i tittel

Et søk uten mellomrom (f.eks. «kirker») treffer toppklausulene; et flerordssøk («løs jord») gjør titleText/allText om til løs*jord-wildcards, som ofte ikke matcher → da faller den leksikalske scoren lavt og vektoren overtar.

2. Type-boost (multiplikativ)

!boost b=typenumber

Ganger scoren med et felt som rangerer dokumenttyper — finjusterer rekkefølgen mellom typer på tvers av alle klausulene.

3. Filterklausuler (ikke boost — fjerner treff)

!serie:*series_historic* ekskluderer historiske serier
!serie:*series_time* ekskluderer tidsserier

(droppes hvis listhidden).

4. Vektor-laget (semantikk)

a) Hybrid-filter — avgjør hva som kommer med:

allText:*<tekst>* OR {!frange l=0.78}query($knn_q)

Et dokument beholdes hvis det enten inneholder søket som substring (venstre side) eller har cosinus ≥ 0.56 mot embeddingen (l=0.78). Dette er nøkkelen: leksikalske treff overlever uansett, så terskelen rammer bare rene vektor-treff.

b) ReRank — avgjør rekkefølgen:

{!rerank reRankQuery=$knn_q reRankDocs=200 reRankWeight=20}

sluttscore = leksikalsk_score + 20 × cosinus-score, brukt på de øverste 200.

Den viktigste innsikten

Boostingen er selvbalanserende:

  • Sterkt leksikalsk treff (ettordssøk som «kirker» → ^70+) → leksikalsk score dominerer.
  • Svakt leksikalsk treff (flerordssøk som «løs jord», ingen sammenhengende wildcard-match) → leksikalsk score er liten (~0.4–0.9), og vektoren styrer rangeringen → «løsmasser» havner øverst.

Felter i søkeindeksen (utdrag fra schema.xml)

NameTypeIndexedStoredRequiredMultiValuedNotes
uuidstringtruetruetruefalse
titlestringtruetruefalse
abstractstringtruetruefalse
purposestringtruetruefalse
typestringtruetruefalse
themestringtruetruefalse
placestringtruetruetrue
placegroupsstringtruetruetrue
licensestringtruetruefalse
nationalinitiativestringtruetruetrue
organizationgroupstringtruetruefalse
organizationstringtruetruefalse
organizationsstringtruetruetrue
organization2stringtruetruefalse
organization3stringtruetruefalse
organizationContactnamestringfalsetruefalse(fixed typo: stored="true")
organization2Contactnamestringfalsetruefalse
organization3Contactnamestringfalsetruefalse
organization_seo_lowercaselowercasetruetruefalse
organization_shortnamestringtruetruefalse
organization_shortname_lowercaselowercasetruetruefalse
title_lowercaselowercasetruetruefalse
topic_categorystringtruetruefalse
keywordstringtruetruetrue
titleTexttext_exacttruefalsetrueexact and fuzzy
allTexttext_exacttruefalsetruestemmed
allText2text_notruefalsetrue
allText3text_phonetictruefalsetruephonetic
organization_logo_urlstringfalsetruefalse
date_publisheddatetruetruefalse
date_updateddatetruetruefalse
legend_description_urlstringfalsetruefalse
product_page_urlstringfalsetruefalse
product_sheet_urlstringfalsetruefalse
product_specification_urlstringfalsetruefalse
thumbnail_urlstringfalsetruefalse
distribution_urlstringfalsetruefalse
distribution_protocolstringtruetruefalse
distribution_namestringfalsetruefalse
maintenance_frequencystringfalsetruefalse
typenumberinttruetruefalse
ServiceDistributionUrlForDatasetstringfalsetruefalse
ServiceDistributionProtocolForDatasetstringfalsetruefalse
ServiceDistributionNameForDatasetstringfalsetruefalse
DistributionProtocolsstringtruetruetrue
areastringtruetruetrue
datasetservicestringfalsetruetrue
servicedatasetstringfalsetruetrue
bundlestringfalsetruetrue
servicelayersstringfalsetruetrue
accessconstraintstringfalsetruefalse
otherconstraintsaccessstringfalsetruefalse
Field types (utdrag)
NamekeyFielddefValStoredIndexedClassvalType
popularMetadataFileuuid0truetruesolr.ExternalFileFieldfloat
knn_vectortruetruesolr.DenseVectorFieldfloat array
NameTypeIndexedStoredRequiredMultiValuedNotes
popularMetadatapopularMetadataFiletruetrue
vectorknn_vectortruetrue

Felter som kopieres til samlefelter (copyField)

SourceDestination
uuidallText
titleallText
titletitle_lowercase
titletitleText
abstractallText
purposeallText
typeallText
themeallText
organizationgroupallText
topic_categoryallText
keywordallText
organization2allText
organization3allText
organization3allText
organization_shortnameallText
organization_shortnameorganization_shortname_lowercase
organizationContactnameallText
organization2ContactnameallText
organization3ContactnameallText
distribution_nameallText
ServiceDistributionNameForDatasetallText
uuidallText2
titleallText2
abstractallText2
purposeallText2
typeallText2
themeallText2
organizationgroupallText2
topic_categoryallText2
keywordallText2
organization2allText2
organization3allText2
organizationContactnameallText2
organization2ContactnameallText2
organization3ContactnameallText2
distribution_nameallText2
ServiceDistributionNameForDatasetallText2
uuidallText3
titleallText3
abstractallText3
purposeallText3
typeallText3
themeallText3
organizationgroupallText3
topic_categoryallText3
keywordallText3
organization2allText3
organization3allText3
distribution_nameallText3
organizationContactnameallText3
organization2ContactnameallText3
organization3ContactnameallText3
ServiceDistributionNameForDatasetallText3

API-dokumentasjon

API-et er dokumentert på https://kartkatalog.geonorge.no/swagger

Eksempelkall

https://kartkatalog.geonorge.no/api/search?text=berggrunn — returnerer alle metadataoppføringer som inneholder teksten "berggrunn"