-
Notifications
You must be signed in to change notification settings - Fork 3
Bibelstellensuche Technischer Überblick
In den MARC21-Datensätzen sind z.T. die im innerhalb des Textes 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, 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 linken und rechten Endpunkte bestimmt.
#Anpassungen VuFind
Durch die Ersetzung des Standard-Solr-Query-Builders durch $VUFIND_HOME/module/ixTheo/src/ixTheo/Search/Backend/Solr/IxTheoQueryBuilder.php
wird im Falle der Erkennung einer Bibelstelle die Anfrage so angepasst, dass bei der Verarbeitung in Solr der BibleRangeParser aufgerufen wird. Andernfalls wird die Anfrage unverändert an Solr durchgereicht. Hierfür war neben der Erstellung der Klasse IxTheoQueryBuilder das Hinzufügen von IxTheoSolrDefaultBackendFactory.php
in module/VuFind/config/module.config.php
notwendig.
#Verarbeitung in Solr In die vufind-eigene Solr-Umgebung wurde ein zusätzliches Parserplugin integriert ($VUFIND_HOME/solr/lib/BibleRangeParser-x.x.x.jar).
Folgende Klassen finden sich im Paket de.uni_tuebingen.ub.ixTheo
:
Dies ist der Einstiegspunkt von Solr. Dieses Plugin erstellt den BibleRangeParser
und hat sonst keine weitere Funktion.
Der Parser nimmt eine Anfrage des Users entgegen und generiert einen neuen Query. Diese Query besteht aus einer Lucene-Query
, die in einer BibleRangeQuery
geschachtelt wird, damit diese den Lucene-Query
scoren kann. Die BibleRangeQuery
wird dann mit einem FilterQuery
anhand eines BibleRangeFilters
gefiltert.
Diese Klasse erstellt den BibleRangeScoreProvider
und hat sonst keine weitere Funktion.
Um Ergebnisse einer Suche zu ordnen wird jedem Ergebniss ein Zahlenwert zugewiesen. Dies passiert in dieser Klasse. Dabei wird die Summe der minimalen Abstände der Eingabe-Ranges zu den Ranges eines Ergebnisses genutzt.
Mit diesem Filter werden alle Ergebnisse verworfen, welche zu keine Bibelstelle oder zu einer Bibelstelle, die nicht angefragt wurde, gehören.
Die Range
-Klasse beschreibt einen Bereich.
-
int getDistance(Range)
errechnet einen Zahlenwert, der den 'Abstand' beschreibt, wenn die beiden Bereiche überlappen. Sonst wirdRange.OUT_OF_RANGE
zurückgegeben. -
int getMinimumDistance(Range[])
errechnet den 'Abstand' zu den gegebenen Bereichen und gibt den kleinesten 'Abstand' zurück. -
boolean intersects(Range)
gibt an, ob sich die Bereiche überlappen. -
static int getDistance(Range[], Range[])
berechnet die Summe der kleinsten Distanzen. -
static boolean doAllSourceRangesIntersectsSomeTargetRanges(Range[], Range[])
prüft ob sich jeder Bereich des ersten Arguments mindestens mit einem Bereich des zweiten Arguments schneidet.
Ist auch eine Range
, die Zusatzfunktionen für die Bibelstellensuche bereit hält, da diese nur String
s als Eingaben hat.
-
Range(String)
erzeugt einen Bereich durch das Interpretieren desString
s. 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 jedemString
einRange
. Dabei muss derString
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.