# Search/Retrieve via URL (SRU)

SRU steht für Search/Retrieve via URL. Über SRU-Schnittstellen können gezielt bestimmte Indizes im jeweiligen System nach bestimmten Begriffen durchsucht werden.

Einen guten Einstieg in SRU bietet <a href="https://de.wikipedia.org/wiki/Search/Retrieve_via_URL" target="_blank">Wikipedia</a>. Details zum SRU-Standard liefert die offizielle <a href="https://www.loc.gov/standards/sru/sru-2-0.html" target="_blank">Dokumentation</a> der Library of Congress.

## Explain-Operation

Mit der Explain-Operation werden Informationen zu Abfragemöglichkeiten angezeigt: 

    <Basis-URL>?operation=explain

Beispiel:<br/>
<a href="https://uzb.swisscovery.ch/view/sru/41SLSP_UZB?version=1.2&operation=explain" target="_blank">https://uzb.swisscovery.ch/view/sru/41SLSP_UZB?version=1.2&operation=explain</a>

Unter dem XML-Tag \<indexInfo\> werden die Namen der durchsuchbaren Indices gelistet. Pro Index wird ausgewiesen, welche sogenannten *Relation Operators* erlaubt sind. Beispiel:

    <index>
        <ns:title>dc:title</ns:title>
        <map>
            <name set="alma">dc_title</name>
        </map>
        <configInfo>
            <supports type="relation">all</supports>
            <supports type="relation">=</supports>
            <supports type="relation">==</supports>
            <supports type="emptyTerm"/>
        </configInfo>
    </index>

Unter dem Tag \<schemaInfo\> sind die verfügbaren Metadatenformate aufgelistet. Aus dem untenstehenden Beispiel geht hervor, dass die betreffende SRU-Schnittstelle z.B. mit recordSchema=dc abgefragt werden kann, um Metadaten im Dublin Core Format zurückzubekommen.

    <schemaInfo>
        <schema identifier="http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" name="marcxml" sort="true"/>
        <schema identifier="info:srw/schema/1/dc-v1.1" name="dc" sort="true"/>
        <schema identifier="info:srw/schema/1/mods-v3.5" name="mods" sort="true"/>
        <schema identifier="info:srw/schema/1/dcx-v1.0" name="dcx" sort="true"/>
        <schema identifier="info:srw/schema/8/unimarcxml-v0.1" name="unimarcxml" sort="true"/>
        <schema identifier="http://www.nl.go.kr/kormarc/" name="kormarcxml" sort="true"/>
        <schema identifier="http://www.nlc.cn/" name="cnmarcxml" sort="true"/>
        <schema identifier="http://www.loc.gov/standards/iso20775/" name="isohold" sort="true"/>
    </schemaInfo>

## searchRetrieve-Operation

Für die eigentliche Suchabfrage wird die searchRetrieve-Operation genutzt: 

    <Basis-URL>?operation=searchRetrieve

### Contextual Query Language (CQL)

Suchanfragen werden in der <a href="https://www.loc.gov/standards/sru/cql/" target="_blank">Contextual Query Language</a> (CQL) formuliert. Mithilfe von Booleschen Operatoren (and, or, not) können komplexe Abfragen erstellt werden.

Spezielle Zeichen wie Leerschläge und Anführungszeichen müssen URL-encoded werden. Beispiele:

    %20 Leerschlag
    %22 Anführungszeichen
    %3D Gleichheitszeichen
    %2F Forward slash
    %3A Doppelpunkt
    %2E Punkt
    %2D minus

Für das URL-Encoding kann z.B. auch dieses Online-Tool genutzt werden: <a href="https://www.urlencoder.org/" target="_blank">https://urlencoder.org</a>.

### Durch Resultatseiten blättern

Bei einer Query wird jeweils nur eine Teilmenge der Treffer direkt zurückgeliefert. Dies ist serverseitig definiert - oft sind es 10 Records, sozusagen die erste Resultatseite. Die absolute Anzahl Treffer kann aus dem Tag \<numberOfRecords\> herausgelesen werden. Beispiel: 

    <numberOfRecords>629</numberOfRecords>

Im Element \<nextRecordPosition\> kann überprüft werden, welches Record als nächstes kommt. Mit dieser Zahl kann die nächste Resultatseite aufgerufen werden, indem der startRecord-Parameter an die vorangegangene Suche angehängt wird. Beispiel:

<a href="https://uzb.swisscovery.ch/view/sru/41SLSP_UZB?version=1.2&operation=searchRetrieve&recordSchema=dc&query=alma.title=python&startRecord=11" target="_blank">https://uzb.swisscovery.ch/view/sru/41SLSP_UZB?version=1.2&operation=searchRetrieve&recordSchema=dc&query=alma.title=python&startRecord=11</a>