Annexe L. Using the SRU server

Nicolas Morin



Table des matières

1. Using the SRU server
1.1. Explain
1.2. Search
1.3. Retrieve

1. Using the SRU server

Koha implements the Search/Retrieve via URL (SRU) protocol. More information about the protocol itself can be found at The version implemented is version 1.1.

1.1. Explain

If you want to have informations about the implementation of SRU on a given server, you should have access to the Explain file using a request to the server without any parameter. Like response from the server is an xml file that should look like the following and will give you information about the default settings of the SRU server.

                         <explain xml:base="zebradb/explain-biblios.xml">
                         try stylesheet url: http://./?stylesheet=docpath/sru2.xsl
                    <serverInfo protocol="SRW/SRU/Z39.50">
                         <title lang="en" primary="true">Koha 3 Bibliographic SRU/SRW/Z39.50 server</title>
                         <description lang="en" primary="true">Koha 3 Bibliographic Server</description>
                         <set name="cql" identifier="info:srw/cql-context-set/1/cql-v1.1">
                              <title>CQL Standard Set</title>
                         <index search="true" scan="true" sort="false">
                         <title lang="en">CQL Server Choice</title>
                              <name set="cql">serverChoice</name>
                       <attr type="1" set="bib1">text</attr>
              <index search="true" scan="true" sort="false">
                 <title lang="en">CQL All</title>
        <name set="cql">all</name>
        <attr type="1" set="bib1">text</attr>
        <!-- Record ID index -->
        <index search="true" scan="true" sort="false">
        <title lang="en">Record ID</title>
        <name set="rec">id</name>
        <attr type="1" set="bib1">rec:id</attr>
        <attr type="4" set="bib1">3</attr>

1.2. Search

This url : is composed of the following elements:

  • base url of the SRU server :

  • search part with the 3 required parameters : version, operation and query. The parameters within the search part should be of the key=value form, and can be combined with the & character.

One can add optional parameters to the query, for instance maximumRecords indicating the maximum number of records to be returned by the server. So will only get the first 5 results results from the server. gives more details about the search operations and in particular the list of optional parameters for searching.

1.2.1. More details about Search

The "operation" key can take two values: scan or searchRetrieve.

If operation=searchRetrieve, then the search key should be query. As in : operation=searchRetrieve&query=reefs

If operation=scan, then the search key should be scanClause. As in : operation=scan&scanClause=reefs

etc/zebradb/biblios/etc/bib1.att defines Zebra/3950 indexes that exist on your system. For instance you'll see that we have indexes for Subject and for Title: att 21 Subject and att 4 Title respectively.

In the file located under etc/zebradb/ I see that an access point already uses my Subject index (index.dc.subject = 1=21) while another uses my Title index (index.dc.title = 1=4) I know this is my Subject index because as I've seen just before in my bib1.att file, it's called with =1=21 in Z3950: so index.dc.subject = 1=21 correctly points to my Subject index. And Title was called with 1=4 so index.dc.title = 1=4 correctly points to my Title index. I can now construct my query just like I would in a search box, just preceding it with the "query" key: query=Subject=reefs and Title=coral searches "reefs" in the subject and "coral" in the title. The full url would be and Title=coral If I want to limit the result set to just 5 records, I can do and Title=coral&maximumRecords=5

I can also play with truncate, relations, etc. Those are also defined in my file. I can see for instance the position properties defined as:

               position.first              = 3=1 6=1
              # "first in field"
               position.any                = 3=3 6=1
                 # "any position in field"

So as an example if I want "coral" to be at the beginning of the title, I can do this query : first

1.3. Retrieve

My search for reefs&maximumRecords=1 retrieves just on record. The response looks like this:

<record xsi:schemaLocation=" standards/marcxml/schema/MARC21slim.xsd">
<leader> cam a22 4500</leader>
<datafield tag="010" ind1=" " ind2=" ">
<subfield code="a">2-603-01193-6</subfield>
<subfield code="b">rel.</subfield>
<subfield code="d">159 F</subfield>
<datafield tag="020" ind1=" " ind2=" ">
<subfield code="a">FR</subfield>
<subfield code="b">00065351</subfield>
<datafield tag="101" ind1="1" ind2=" ">
<subfield code="c">ita</subfield>
<datafield tag="105" ind1=" " ind2=" ">
<subfield code="a">a z 00|y|</subfield>
<datafield tag="106" ind1=" " ind2=" ">
<subfield code="a">r</subfield>
<datafield tag="100" ind1=" " ind2=" ">
<subfield code="a">20091130 frey50 </subfield>
<datafield tag="200" ind1="1" ind2=" ">
<subfield code="a">Guide des récifs coralliens / A Guide to Coral Reefs</subfield>
<subfield code="b">Texte imprimé</subfield>
<subfield code="e">la faune sous-marine des coraux</subfield>
<subfield code="f">A. et A. Ferrari</subfield>
<datafield tag="210" ind1=" " ind2=" ">
<subfield code="a">Lausanne</subfield>
<subfield code="a">Paris</subfield>
<subfield code="c">Delachaux et Niestlé</subfield>
<subfield code="d">cop. 2000</subfield>
<subfield code="e">impr. en Espagne</subfield>
<datafield tag="215" ind1=" " ind2=" ">
<subfield code="a">287 p.</subfield>
<subfield code="c">ill. en coul., couv. ill. en coul.</subfield>
<subfield code="d">20 cm</subfield>