Skip to content

Bereichssuche Technischer Überblick

thefass edited this page Oct 6, 2023 · 14 revisions

Überblick

Grundsätzlich umfasst die Bereichssuche eine allgemeine Implementierung, von der die Bibestellensuche, die Kanonessuche und die Zeitbereichssuche abgeleitet sind. Die entsprechenden Bereiche aus den Metadaten (wie z.B. Bibel/Kanonesstellen) werden auf ein Nummernschema abgebildet und als Bereiche in Solr gespeichert. Bei der Suche werden die Eingaben auf das selbe Nummernschema abgebildet und miteinander verglichen, um die Treffermenge zu ermitteln und die Sortierung zu ermöglichen.

Beispiel Bibelstellensuche

In den MARC21-Datensätzen sind z.T. die im Text behandelten Bibelstellen hinterlegt. Die Bibestellensuche soll nun der Identifikation von Überschneidungen dienen, d.h. die Möglichkeit zur Verfügung stellen, ausgehend von einem angegebenen Bereich (z.B. Gen 1,5-17) alle Texte zu finden, die den Bereich vollständig oder in Teilen enthalten (z.B. Gen 1,1-20, Gen 1,7-12).

Dabei kann die Genauigkeit bis auf Versebene angegeben werden, wobei einzelne Verse durch eine Punktnotation getrennt werden können (z.B. Gen 1,1-3.4-5.7.9 umfasst Gen 1,1-3, Gen 1,4-5 und die Verse 7 und 9). Innerhalb eines Buches können vollständige Kapitelabschnitte durch eine Kommanotation angegeben werden (z.B. Gen 1-7,5 Gen 1,2-7,5).

Als Maß der Überschneidung (Scoring) wird die Summe der minimalen Abstände der Eingabe-Ranges zu den Ranges eines Ergebnisses genutzt, d.h. für jedes Abfrageteilintervall wird der Absolutbetrag der Summe der Differenzen der linken und rechten Endpunkte bestimmt.

Image showing scoring

Anpassungen der Metadaten (MARC21)

Je nach Suche werden die Metadaten zunächst aus MARC21 ausgelesen und in verschiedene Felder geschrieben. Dafür werden auch Normdaten mit ausgewertet. Siehe auch:

Anpassungen für Solr-Import

In Solr sind zusätzliche Felder definiert. Siehe auch: schema_ixtheo_fields.xml.

Im Anschluss werden sie beim Import entsprechend befüllt, siehe: marc_ixtheo.properties.

Anpassungen für Solr-Abfrage

In die VuFind-eigene Solr-Umgebung wurden zusätzliche Parser-Plugins integriert. Diese sind in der solrconfig.xml registriert.

Vom Ablauf her findet zunächst Query Rewriting statt, um ggf. weitere Kriterien (Facetten etc.) korrekt zu berücksichtigen. Danach wird aus Performancegründen erst geprüft, ob die benötigten Bereichsfelder in den Ergebnissen überhaupt vorhanden sind. Erst im Anschluss findet die genauere Score-Berechnung statt. Hierfür wird pro Dokument die beste Schnittmenge über den gesuchten + die vorhandenen Bereiche gebildet, und daraus wird ein Score zwischen 1.0 (Volltreffer) und 0.0 (bzw. Float.NEGATIVE_INFINITY = kein Treffer) generiert, der als Basis für die Sortierung dient (absteigend).

RangeSearch

Hier befinden sich die allgemeinen Klassen, von denen später die einzelnen Suchtypen erben.

RangeParserPlugin

Allgemeiner Einstiegspunkt des Plugins. Abgeleitete Klassen wie z.B. das BibleRangeParserPlugin starten die Auswertung der Query über den zugehörigen RangeParser.

Range

Datenklasse die einen Bereich repräsentiert (mit Unter- und Obergrenze), sowie verschiedenen Hilfsfunktionen z.B. zur Berechnung von Schnittmengen, zur Vereinigung verschiedener überlappender Bereiche oder zur Berechnung des Scores mittels des Vergleiches der gesuchten und vorhandenen Bereiche.

RangeParser

Klasse mit diversen Konstanten zum Parsen von Bereichsangaben (z.B. in Queries oder in DB-Feldern).

RangeQuery

Diese Klasse erstellt den RangeScorer und löst den Gewichtungsvorgang aus. Außerdem wird Query Rewriting über den Parent ausgelöst (falls Z.B. neben Bereichen noch weitere Suchkriterien wie z.B. Facetten aktiv sind).

RangeScorer

Der Scorer stellt vor allem die Iterationslogik über Ergebnisse bereit und löst das Scoring über RangeWeight aus.

RangeWeight

Stößt die Berechnung des Scorings für einzelne Dokumente an, und verwendet dazu die Range-Klasse.

BibleRangeSearch

Hier befinden sich die Anpassungen für die Bibelstellensuche.

BibleRangeParserPlugin

Dies ist der Einstiegspunkt von Solr. Dieses Plugin erstellt den BibleRangeParser und hat sonst keine weitere Funktion.

BibleRange

Ist auch eine Range, die Zusatzfunktionen für die Bibelstellensuche bereit hält, da diese nur Strings als Eingaben hat.

  • Range(String) erzeugt einen Bereich durch das Interpretieren des Strings. Der String muss aus 15 Zeichen bestehen, wobei die ersten sieben Zeichen die untere Schranke und die letzten sieben Zeichen die obere Schranke darstellen. Das Zeichen in der Mitte wird zur Lesebarkeit als Trennzeichen beliebig gefüllt.
  • Range[] getRanges(String[]) erzeugt aus jedem String ein Range. Dabei muss der String das beim Konstruktur beschriebene Format haben.
  • Range[] getRanges(String, String) Das erste Argument ist ein Text, in dem Bereiche kodiert und mit einem Trennzeichen getrennt sind. Dieses Trennzeichen wird im zweiten Argument angegeben.

BibleRangeParser

Überschreibt den RangeParser und verwendet dafür BibleRange und BibleRangeQuery. Außerdem ist hier Logik enthalten um zu unterscheiden, ob nach gesamten Büchern gesucht wird.

BibleRangeQuery

Überschreibt RangeQuery und verwendet dafür BibleRangeWeight und BibleRangeQuery.

BibleRangeWeight

Überschreibt RangeWeight und verwendet die für die Bibelstellensuche definierte Datenfelder + Logik aus dem BibleRangeParser und BibleRange.

CanonesRangeSearch

Ähnlich wie die Bibelstellensuche, aber für Canones.

TimeAspectRangeSearch

Zeitbereichssuche. Derzeit inaktiv bzw. es wird stattdessen der BBOX-Ansatz verwendet.

Anpassungen in VuFind

Wenn ein User eine Anfrage startet, wird diese zunächst von VuFind verarbeitet. In der searches.ini sind hierfür spezielle Search Handler definiert, insb. BibleRangeSearch und CanonesRangeSearch. Die Logik hierzu befindet sich im Namespace IxTheo\Search\Backend\Solr. Der Einstieg erfolgt über den QueryBuilder und die Logik befindet sich im SearchHandler.

Die eingegebenen Bibelstellen bzw. Kanonesstellen werden zunächst per Shell-Aufruf der C++ Programme normalisiert (siehe bib_ref_to_codes_tool und canon_law_ref_to_codes_tool). Daraus wird ein entsprechender Query String generiert und an Solr weitergegeben.