2020.06 2021.06

Die MyCoRe-Anfragesprache MCR-QL

Der MyCoRe-Kern stellt eine eigene, backend-unabhängige Anfragesprache zur Verfügung, die als einfacher String, im XML-Format oder als Java-Objekt formuliert werden kann.

Datentypen und Operatoren

Jedem Suchfeld ist ein definierter Datentyp zugeordnet. Der Datentyp bestimmt die möglichen Operatoren für Suchanfragen und legt implizit fest, wie Inhalte dieses Typs behandelt werden (Normalisierung von Umlauten, Stammwortbildung statt exakter Suche etc.). Für jeden Datentyp gibt es eine festgelegte Menge vordefinierter Standard-Operatoren, die jede Searcher-Implementierung unterstützen muss. Darüber hinaus kann eine Implementierung aber auch eigene Datentypen und eigene Operatoren mit erweiterten Suchmöglichkeiten definieren.

Die nachfolgende Tabelle zeigt alle Standard-Operatoren, die für die MCR-QL zur Verfügung stehen:

Operator Beschreibung
= exakter Wertvergleich
> größer
< kleiner
>= größer oder gleich
<= kleiner oder gleich
like Wildcard-Suche mittels * und ?
contains Wort an beliebiger Stelle im Text
phrase Wortgruppe an beliebiger Stelle im Text

Bei der Konfiguration der Suchfelder ist insbesondere auf die richtige Wahl der Textdatentypen zu achten. Es wird zwischen drei verschiedenen Datentypen für Textfelder unterschieden: identifier, name und text. Die folgenden Standard-Datentypen sind derzeit implementiert:

Datentyp Suchoperatoren Beschreibung
identifier =, <, >, <=, >=,like ID, URN, Dateiname etc., also für exakte Werte, keine Normalisierung oderStemming
name =, <, >, <=, >=,like, contains Personen- oder Ortsnamen etc., Umlautnormalisierung, aber kein Stemming
text =, <, >, <=, >=,like, contains,phrase Volltext, Abstract, freier Text, Umlautnormalisierung, Stemming
date =, <, >, <=, >= Datum, vollständig im Format yyyy-MM-dd
time =, <, >, <=, >= Uhrzeit oder zeitliche Dauer, im Format HH:mm:ss
timestamp =, <, >, <=, >= Zeitpunkt, im Format 'yyyy-MM-dd HH:mm:ss'
boolean = 'true' oder 'false'
decimal =, <, >, <=, >= Gleitkommazahl,"." als Trennzeichen
integer =, <, >, <=, >= Ganzzahl

Es ist Aufgabe der Suchimplementierung, diese Datentypen auf möglichst geeignete Suchstrukturen abzubilden und die Standard-Operatoren in der späteren Suche umzusetzen. Zu beachten ist, dass für Datums-, Zeit- und Boolean-Werte das Format für die Indizierung (wie werden die Felder zur Indizierung übergeben) und die spätere Suche (wie wird ein Wert in einer Query formatiert) exakt festgelegt ist (siehe Formate in obiger Tabelle).

Sortierkriterien festlegen

Sortierkriterien kann man mit dem Tag <sortBy /> festlegen. Darin können beliebig viele Felder und die jeweilige Reihenfolge (ascending oder descending) festgelegt werden.

1
2
3
4
<sortBy>
  <field name="title" order="descending" />
  <field name="dateCreated" order="ascending" />
</sortBy>

Suchanfragen formulieren

Eine Suchanfrage kann als XML-Dokument oder als Textausdruck formuliert werden. Für Programmierer besteht weiterhin die Möglichkeit, eine Suche als zusammengesetztes Java-Objekt zu formulieren.

Eine einfache Suchbedingung enthält das zu durchsuchende Feld, einen Suchoperator und den Vergleichswert, z.B. Suche nach dem Wort „Optik“ im Titel:

1
2
3
4
5
6
  title contains "Optik"

  <condition field="title" operator="contains" value="Optik" />

  MCRFieldDef titleField = MCRFieldDef.getDef("title");
  new MCRQueryCondition( titleField, "contains", "Optik" );

Die Klassen MCRQueryParser und MCRQueryCondition implementieren die Java-Darstellung einer Query bzw. den Parser, um aus der String- oder XML-Darstellung die Java-Darstellung zu gewinnen und zwischen den Darstellungen zu wechseln.

Einfache Suchbedingungen können über and/or/not-Ausdrücke miteinander verknüpft und so zu komplexeren Suchanfragen zusammengesetzt werden:

1
2
3
4
5
6
7
8
  ( not (title contains "Optik") ) and ( date &gt; "2006-02-22" )

  <boolean operator="AND">
    <boolean operator="NOT">
      <condition field="title" operator="contains" value="Optik" />
    </boolean>
    <condition field="date" operator="&amp;gt;" value="2006-02-22" />
  </boolean>

Solche komplexen Suchbedingungen können über die Klassen MCRAndCondition, MCROrCondition und MCRNotCondition aus dem Paket org.mycore.parsers.bool auch als Java-Objekte gebildet werden.

Hier eine vollständige Beispiel-Anfrage in MCR-QL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<query maxResults="100" numPerPage="10" mask="editor_form_search-cite-a.xml">
  <conditions format="xml">
    <boolean operator="and">
      <boolean operator="and">
        ...
        <condition3 operator="contains" value="Trappe" field="citeDocCreaName" />
        ...
        <condition7 field="citeNumPages" operator="=" value="2" />
        ...
      </boolean>
      <condition94 field="objectType" operator="=" value="cite" />
    </boolean>
  </conditions>
  <sortBy>
    <field name="citeCategory" order="ascending" />
  </sortBy>
</query>