6b2e4806e1a83c97d3a54acdbe7d40b63c638923
[metaproxy-moved-to-github.git] / doc / zoom.xml
1 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.4//EN"
2     "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
3  <!ENTITY copyright SYSTEM "copyright.xml">
4  <!ENTITY % idcommon SYSTEM "common/common.ent">
5      %idcommon;
6 ]>
7 <refentry id="ref-zoom">
8  <refentryinfo>
9   <productname>Metaproxy</productname>
10   <info><orgname>Index Data</orgname></info>
11  </refentryinfo>
12
13  <refmeta>
14   <refentrytitle>zoom</refentrytitle>
15   <manvolnum>3mp</manvolnum>
16   <refmiscinfo class="manual">Metaproxy Module</refmiscinfo>
17  </refmeta>
18
19  <refnamediv>
20   <refname>zoom</refname>
21   <refpurpose>Metaproxy ZOOM Module</refpurpose>
22  </refnamediv>
23
24  <refsect1>
25   <title>DESCRIPTION</title>
26   <para>
27    This filter implements a generic client based on
28    <ulink url="&url.yaz.zoom;">ZOOM</ulink> of YAZ.
29    The client implements the protocols that ZOOM C does: Z39.50, SRU
30    (GET, POST, SOAP) and SOLR .
31   </para>
32
33   <para>
34    This filter only deals with Z39.50 on input. The following services
35    are supported: init, search, present and close. The backend target
36    is selected based on the database as part search and
37    <emphasis>not</emphasis> as part of init.
38   </para>
39
40   <para>
41    This filter is an alternative to the z3950_client filter but also
42    shares properties of the virt_db - in that the target is selected
43    for a specific database
44   </para>
45
46   <para>
47    The ZOOM filter relies on a target profile description, which is
48    XML based. It picks the profile for a given database from a web service
49    or it may be locally given for each unique database (AKA virtual database
50    in virt_db). Target profiles are directly and indrectly given as part
51    of the <literal>torus</literal> element in the configuration.
52   </para>
53
54  </refsect1>
55
56  <refsect1>
57   <title>CONFIGURATION</title>
58   <para>
59    The configuration consists of six parts: <literal>torus</literal>,
60    <literal>fieldmap</literal>, <literal>cclmap</literal>,
61    <literal>contentProxy</literal>, <literal>log</literal>
62    and <literal>zoom</literal>.
63   </para>
64   <refsect2>
65    <title>torus</title>
66    <para>
67     The <literal>torus</literal> element specifies target profiles
68     and takes the following content:
69    </para>
70    <variablelist>
71     <varlistentry>
72      <term>attribute <literal>url</literal></term>
73      <listitem>
74       <para>
75        URL of Web service to be used when fetch target profiles from
76        a remote service (Torus normally).
77       </para>
78       <para>
79        The sequence <literal>%query</literal> is replaced with a CQL
80        query for the Torus search.
81       </para>
82       <para>
83        The special sequence <literal>%realm</literal> is replaced by value
84        of attribute <literal>realm</literal> or by realm DATABASE argument.
85       </para>
86       <para>
87        The special sequence <literal>%db</literal> is replaced with
88        a single database while searching. Note that this sequence
89        is no longer needed, because the <literal>%query</literal> can already
90        query for a single database by using CQL query
91        <literal>udb==...</literal>.
92       </para>
93      </listitem>
94     </varlistentry>
95     <varlistentry>
96      <term>attribute <literal>content_url</literal></term>
97      <listitem>
98       <para>
99        URL of Web service to be used to fetch target profile
100        for a given database (udb) of type content. Semantics otherwise like
101        <literal>url</literal> attribute above.
102       </para>
103      </listitem>
104     </varlistentry>
105     <varlistentry>
106       <term>attribute <literal>realm</literal></term>
107       <listitem>
108         <para>
109          The default realm value. Used for %realm in URL, unless
110          specified in DATABASE argument.
111         </para>
112       </listitem>
113     </varlistentry>
114     <varlistentry>
115      <term>attribute <literal>proxy</literal></term>
116      <listitem>
117       <para>
118        HTTP proxy to bse used for fetching target profiles.
119       </para>
120      </listitem>
121     </varlistentry>
122     <varlistentry>
123      <term>attribute <literal>xsldir</literal></term>
124      <listitem>
125       <para>
126        Directory that is searched for XSL stylesheets. Stylesheets
127        are specified in the target profile by the
128        <literal>transform</literal> element.
129       </para>
130      </listitem>
131     </varlistentry>
132     <varlistentry>
133      <term>attribute <literal>element_transform</literal></term>
134      <listitem>
135       <para>
136        Specifies the element that triggers retrieval and transform using
137        the parameters elementSet, recordEncoding, requestSyntax, transform
138        from the target profile. Default value
139        is "pz2", due to the fact that for historical reasons the
140        common format is that used in Pazpar2.
141       </para>
142      </listitem>
143     </varlistentry>
144     <varlistentry>
145      <term>attribute <literal>element_raw</literal></term>
146      <listitem>
147       <para>
148        Specifies an element that triggers retrieval using the
149        parameters elementSet, recordEncoding, requestSyntax from the
150        target profile. Same actions as for element_transform, but without
151        the XSL transform. Useful for debugging.
152        The default value is "raw".
153       </para>
154      </listitem>
155     </varlistentry>
156     <varlistentry>
157      <term>attribute <literal>explain_xsl</literal></term>
158      <listitem>
159       <para>
160        Specifies a stylesheet that converts one or more Torus records
161        to ZeeExplain records. The content of recordData is assumed to be
162        holding each Explain record.
163       </para>
164      </listitem>
165     </varlistentry>
166     <varlistentry>
167      <term>attribute <literal>record_xsl</literal></term>
168      <listitem>
169       <para>
170        Specifies a stylesheet that converts retrieval records after
171        transform/literal operations.
172       </para>
173       <para>
174        When Metaproxy creates a content proxy session, the XSL parameter
175        <literal>cproxyhost</literal> is passed to the transform.
176       </para>
177      </listitem>
178     </varlistentry>
179     <varlistentry>
180      <term>element <literal>records</literal></term>
181      <listitem>
182       <para>
183        Local target profiles. This element may includes zero or
184        more <literal>record</literal> elements (one per target
185        profile). See section TARGET PROFILE.
186       </para>
187      </listitem>
188     </varlistentry>
189    </variablelist>
190   </refsect2>
191   <refsect2 id="fieldmap">
192    <title>fieldmap</title>
193    <para>
194     The <literal>fieldmap</literal> may be specified zero or more times and
195     specifies the map from CQL fields to CCL fields and takes the
196     following content:
197    </para>
198    <variablelist>
199     <varlistentry>
200      <term>attribute <literal>cql</literal></term>
201      <listitem>
202       <para>
203        CQL field that we are mapping "from".
204       </para>
205      </listitem>
206     </varlistentry>
207     <varlistentry>
208      <term>attribute <literal>ccl</literal></term>
209      <listitem>
210       <para>
211        CCL field that we are mapping "to".
212       </para>
213      </listitem>
214     </varlistentry>
215    </variablelist>
216   </refsect2>
217   <refsect2 id="cclmap_base">
218    <title>cclmap</title>
219    <para>
220     The third part of the configuration consists of zero or more
221     <literal>cclmap</literal> elements that specifies
222     <emphasis>base</emphasis> CCL profile to be used for all targets.
223     This configuration, thus, will be combined with cclmap-definitions
224     from the target profile.
225    </para>
226   </refsect2>
227   <refsect2>
228    <title>contentProxy</title>
229    <para>
230     The <literal>contentProxy</literal> element controls content proxy'in.
231     This section
232     is optional and must only be defined if content proxy'ing is enabled.
233    </para>
234    <variablelist>
235     <varlistentry>
236      <term>attribute <literal>config_file</literal></term>
237      <listitem>
238       <para>
239        Specifies the file that configures the cf-proxy system. Metaproxy
240        uses setting <literal>sessiondir</literal> and
241        <literal>proxyhostname</literal> from that file to configure
242        name of proxy host and directory of parameter files for the cf-proxy.
243       </para>
244      </listitem>
245     </varlistentry>
246     <varlistentry>
247      <term>attribute <literal>server</literal></term>
248      <listitem>
249       <para>
250        Specifies the content proxy host. The host is of the form
251        host[:port]. That is without a method (such as HTTP) and optional
252        port number.
253       </para>
254       <note>
255        <para>
256         This setting is deprecated. Use the config_file (above)
257         to inform about the proxy server.
258        </para>
259       </note>
260      </listitem>
261     </varlistentry>
262     <varlistentry>
263      <term>attribute <literal>tmp_file</literal></term>
264      <listitem>
265       <para>
266        Specifies a filename of a session file for content proxy'ing. The
267        file should be an absolute filename that includes
268        <literal>XXXXXX</literal> which is replaced by a unique filename
269        using the mkstemp(3) system call. The default value of this
270        setting is <literal>/tmp/cf.XXXXXX.p</literal>.
271       </para>
272       <note>
273        <para>
274         This setting is deprecated. Use the config_file (above)
275         to inform about the session file area.
276        </para>
277       </note>
278      </listitem>
279     </varlistentry>
280    </variablelist>
281   </refsect2>
282   <refsect2>
283    <title>log</title>
284    <para>
285     The <literal>log</literal> element controls logging for the
286     ZOOM filter.
287    </para>
288    <variablelist>
289     <varlistentry>
290      <term>attribute <literal>apdu</literal></term>
291      <listitem>
292       <para>
293        If the value of apdu is "true", then protocol packages
294        (APDUs and HTTP packages) from the ZOOM filter will be
295        logged to the yaz_log system. A value of "false" will
296        not perform logging of protocol packages (the default
297        behavior).
298       </para>
299      </listitem>
300     </varlistentry>
301    </variablelist>
302   </refsect2>
303
304   <refsect2>
305    <title>zoom</title>
306    <para>
307     The <literal>zoom</literal> element controls settings for the
308     ZOOM.
309    </para>
310    <variablelist>
311     <varlistentry>
312      <term>attribute <literal>timeout</literal></term>
313      <listitem>
314       <para>
315        Is an integer that specifies, in seconds, how long an operation
316        may take before ZOOM gives up. Default value is 40.
317       </para>
318      </listitem>
319     </varlistentry>
320     <varlistentry>
321      <term>attribute <literal>proxy_timeout</literal></term>
322      <listitem>
323       <para>
324        Is an integer that specifies, in seconds, how long an operation
325        a proxy check will wait before giving up. Default value is 1.
326       </para>
327      </listitem>
328     </varlistentry>
329    </variablelist>
330   </refsect2>
331
332  </refsect1>
333  <refsect1>
334   <title>QUERY HANDLING</title>
335   <para>
336    The ZOOM filter accepts three query types: RPN(Type-1), CCL and
337    CQL.
338   </para>
339   <para>
340    Queries are converted in two separate steps. In the first step
341    the input query is converted to RPN/Type-1. This is always
342    the common internal format between step 1 and step 2.
343    In step 2 the query is converted to the native query type of the target.
344   </para>
345   <para>
346    Step 1: for RPN, the query is passed un-modified to the target.
347   </para>
348   <para>
349    Step 1: for CCL, the query is converted to RPN via
350    <link linkend="cclmap"><literal>cclmap</literal></link> elements part of
351    the target profile as well as
352    <link linkend="cclmap_base">base CCL maps</link>.
353   </para>
354   <para>
355    Step 1: For CQL, the query is converted to CCL. The mappings of
356    CQL fields to CCL fields are handled by
357    <link linkend="fieldmap"><literal>fieldmap</literal></link>
358    elements as part of the target profile. The resulting query, CCL,
359    is the converted to RPN using the schema mentioned earlier (via
360    <literal>cclmap</literal>).
361   </para>
362   <para>
363    Step 2: If the target is Z39.50-based, it is passed verbatim (RPN).
364    If the target is SRU-based, the RPN will be converted to CQL.
365    If the target is SOLR-based, the RPN will be converted to SOLR's query
366    type.
367   </para>
368  </refsect1>
369
370  <refsect1>
371   <title>SORTING</title>
372   <para>
373    The ZOOM module actively handle CQL sorting - using the SORTBY parameter
374    which was introduced in SRU version 1.2. The conversion from SORTBY clause
375    to native sort for some target is driven by the two parameters:
376    <link linkend="sortStrategy"><literal>sortStrategy</literal></link>
377    and <link linkend="sortmap"><literal>sortmap_</literal><replaceable>field</replaceable></link>.
378   </para>
379   <para>
380    If a sort field that does not have an equivalent
381    <literal>sortmap_</literal>-mapping is passed un-modified through the
382    conversion. It doesn't throw a diagnostic.
383   </para>
384  </refsect1>
385
386  <refsect1>
387   <title>TARGET PROFILE</title>
388   <para>
389    The ZOOM module is driven by a number of settings that specifies how
390    to handle each target.
391    Note that unknown elements are silently <emphasis>ignored</emphasis>.
392   </para>
393   <para>
394    The elements, in alphabetical order, are:
395   </para>
396   <variablelist>
397    <varlistentry>
398     <term id="zoom-torus-authentication">authentication</term><listitem>
399     <para>
400      Authentication parameters to be sent to the target. For
401      Z39.50 targets, this will be sent as part of the
402      Init Request. Authentication consists of two components: username
403      and password, separated by a slash.
404     </para>
405     <para>
406      If this value is omitted or empty no authentication information is sent.
407     </para>
408    </listitem>
409    </varlistentry>
410
411    <varlistentry id="cclmap">
412     <term>cclmap_<replaceable>field</replaceable></term><listitem>
413     <para>
414      This value specifies CCL field (qualifier) definition for some
415      field. For Z39.50 targets this most likely will specify the
416      mapping to a numeric use attribute + a structure attribute.
417      For SRU targets, the use attribute should be string based, in
418      order to make the RPN to CQL conversion work properly (step 2).
419     </para>
420    </listitem>
421    </varlistentry>
422
423    <varlistentry>
424     <term>cfAuth</term><listitem>
425     <para>
426      When cfAuth is defined, its value will be used as authentication
427      to backend target and authentication setting will be specified
428      as part of a database. This is like a "proxy" for authentication and
429      is used for Connector Framework based targets.
430     </para>
431    </listitem>
432    </varlistentry>
433
434    <varlistentry>
435     <term id="zoom-torus-cfproxy">cfProxy</term><listitem>
436     <para>
437      Specifies HTTP proxy for the target in the form
438      <replaceable>host</replaceable>:<replaceable>port</replaceable>.
439     </para>
440    </listitem>
441    </varlistentry>
442
443    <varlistentry>
444     <term>cfSubDB</term><listitem>
445     <para>
446      Specifies sub database for a Connector Framework based target.
447     </para>
448    </listitem>
449    </varlistentry>
450
451    <varlistentry id="zoom-torus-contentConnector">
452     <term>contentConnector</term><listitem>
453     <para>
454      Specifies a database for content-based proxy'ing.
455     </para>
456    </listitem>
457    </varlistentry>
458
459    <varlistentry>
460     <term>elementSet</term><listitem>
461     <para>
462      Specifies the elementSet to be sent to the target if record
463      transform is enabled (not to be confused' with the record_transform
464      module). The record transform is enabled only if the client uses
465      record syntax = XML and a element set determined by
466      the <literal>element_transform</literal> /
467      <literal>element_raw</literal> from the configuration.
468      By default that is the element sets <literal>pz2</literal>
469      and <literal>raw</literal>.
470      If record transform is not enabled, this setting is
471      not used and the element set specified by the client
472      is passed verbatim.
473     </para>
474    </listitem>
475    </varlistentry>
476
477    <varlistentry>
478     <term>literalTransform</term><listitem>
479     <para>
480      Specifies a XSL stylesheet to be used if record
481      transform is anabled; see description of elementSet.
482      The XSL transform is only used if the element set is set to the
483      value of <literal>element_transform</literal> in the configuration.
484     </para>
485     <para>
486      The value of literalTransform is the XSL - string encoded.
487     </para>
488    </listitem>
489    </varlistentry>
490
491    <varlistentry>
492     <term>piggyback</term><listitem>
493     <para>
494      A value of 1/true is a hint to the ZOOM module that this Z39.50
495      target supports piggyback searches, ie Search Response with
496      records. Any other value (false) will prevent the ZOOM module
497      to make use of piggyback (all records part of Present Response).
498     </para>
499    </listitem>
500    </varlistentry>
501
502    <varlistentry>
503     <term>queryEncoding</term><listitem>
504     <para>
505      If this value is defined, all queries will be converted
506      to this encoding. This should be used for all Z39.50 targets that
507      do not use UTF-8 for query terms.
508     </para>
509    </listitem>
510    </varlistentry>
511
512    <varlistentry>
513     <term>recordEncoding</term><listitem>
514     <para>
515      Specifies the character encoding of records that are returned
516      by the target. This is primarily used for targets were records
517      are not UTF-8 encoded already. This setting is only used
518      if the record transform is enabled (see description of elementSet).
519     </para>
520    </listitem>
521    </varlistentry>
522
523    <varlistentry>
524     <term>requestSyntax</term><listitem>
525     <para>
526      Specifies the record syntax to be specified for the target
527      if record transform is enabled; see description of elementSet.
528      If record transform is not enabled, the record syntax of the
529      client is passed verbatim to the target.
530     </para>
531    </listitem>
532    </varlistentry>
533
534    <varlistentry id="sortmap">
535     <term>sortmap_<replaceable>field</replaceable></term><listitem>
536     <para>
537      This value the native field for a target. The form of the value is
538      given by <link linkend="sortStrategy">sortStrategy</link>.
539     </para>
540    </listitem>
541    </varlistentry>
542
543    <varlistentry id="sortStrategy">
544     <term>sortStrategy</term><listitem>
545     <para>
546      Specifies sort strategy for a target. One of:
547      <literal>z3950</literal>, <literal>type7</literal>,
548      <literal>cql</literal>, <literal>sru11</literal> or
549      <literal>embed</literal>. The <literal>embed</literal> chooses type-7
550      or CQL sortby depending on whether Type-1 or CQL is
551      actually sent to the target.
552     </para>
553    </listitem>
554    </varlistentry>
555
556    <varlistentry>
557     <term>sru</term><listitem>
558     <para>
559      If this setting is set, it specifies that the target is web service
560      based and must be one of : <literal>get</literal>,
561      <literal>post</literal>, <literal>soap</literal>
562      or <literal>solr</literal>.
563     </para>
564    </listitem>
565    </varlistentry>
566
567    <varlistentry>
568     <term>sruVersion</term><listitem>
569     <para>
570      Specifies the SRU version to use. It unset, version 1.2 will be
571      used. Some servers do not support this version, in which case
572      version 1.1 or even 1.0 could be set it.
573     </para>
574    </listitem>
575    </varlistentry>
576
577    <varlistentry>
578     <term>transform</term><listitem>
579     <para>
580      Specifies a XSL stylesheet filename to be used if record
581      transform is anabled; see description of elementSet.
582      The XSL transform is only used if the element set is set to the
583      value of <literal>element_transform</literal> in the configuration.
584     </para>
585    </listitem>
586    </varlistentry>
587
588    <varlistentry>
589     <term>udb</term><listitem>
590     <para>
591      This value is required and specifies the unique database for
592      this profile . All target profiles should hold a unique database.
593     </para>
594    </listitem>
595    </varlistentry>
596
597    <varlistentry id="urlRecipe">
598     <term>urlRecipe</term><listitem>
599     <para>
600      The value of this field is a string that generates a dynamic link
601      based on record content. If the resulting string is non-zero in length
602      a new field, <literal>metadata</literal> with attribute
603      <literal>type="generated-url"</literal> is generated.
604      The contents of this field is the result of the URL recipe conversion.
605      The urlRecipe value may refer to an existing metadata element by
606      ${field[pattern/result/flags]}, which will take content
607      of field and perform a regular expression conversion using the pattern
608      given. For example: <literal>${md-title[\s+/+/g]}</literal> takes
609      metadata element <literal>title</literal> and converts one or more
610      spaces to a plus character.
611     </para>
612    </listitem>
613    </varlistentry>
614
615    <varlistentry>
616     <term>zurl</term><listitem>
617     <para>
618      This is setting is mandatory and specifies the ZURL of the
619      target in the form of host/database. The HTTP method should
620      not be provided as this is guessed from the "sru" attribute value.
621     </para>
622    </listitem>
623    </varlistentry>
624   </variablelist>
625  </refsect1>
626  <refsect1>
627   <title>DATABASE parameters</title>
628   <para>
629    Extra information may be carried in the Z39.50 Database or SRU path,
630    such as authentication to be passed to backend etc. Some of
631    the parameters override TARGET profile values. The format is
632   </para>
633   <para>
634    udb,parm1=value1&amp;parm2=value2&amp;...
635   </para>
636   <para>
637    Where udb is the unique database recognised by the backend and parm1,
638    value1, .. are parameters to be passed. The following describes the
639    supported parameters. Like form values in HTTP the parameters and
640    values are URL encoded. The separator, though, between udb and parameters
641    is a comma rather than a question mark. What follows question mark are
642    HTTP arguments (in this case SRU arguments).
643   </para>
644   <variablelist>
645    <varlistentry>
646     <term>user</term>
647     <listitem>
648      <para>
649       Specifies user to be passed to backend. If this parameter is
650       omitted, the user will be taken from TARGET profile setting
651       <link linkend="zoom-torus-authentication">
652        <literal>authentication</literal>
653       </link>
654       .
655      </para>
656     </listitem>
657    </varlistentry>
658    <varlistentry>
659     <term>password</term>
660     <listitem>
661      <para>
662       Specifies password to be passed to backend. If this parameters is
663       omitted, the password will be taken from TARGET profile setting
664       <link linkend="zoom-torus-authentication">
665        <literal>authentication</literal>
666       </link>
667       .
668      </para>
669     </listitem>
670    </varlistentry>
671    <varlistentry>
672     <term>proxy</term>
673     <listitem>
674      <para>
675       Specifies one or more proxies for backend. If this parameter is
676       omitted, the proxy will be taken from TARGET profile setting
677       <link linkend="zoom-torus-cfproxy">
678        <literal>cfProxy</literal></link>.
679        The parameter is a list of  comma-separated  host:port entries.
680        Bost host and port must be given for each proxy.
681      </para>
682     </listitem>
683    </varlistentry>
684    <varlistentry>
685     <term>cproxysession</term>
686     <listitem>
687      <para>
688       Session ID for content proxy. This parameter is, generally,
689       not used by anything but the content proxy itself.
690      </para>
691     </listitem>
692    </varlistentry>
693    <varlistentry>
694     <term>nocproxy</term>
695     <listitem>
696      <para>
697       If this parameter is specified, content-proyxing is disabled
698       for the search.
699      </para>
700     </listitem>
701    </varlistentry>
702    <varlistentry>
703     <term>realm</term>
704     <listitem>
705      <para>
706       Session realm to be used for this target, changed the resulting
707       URL to be used for getting a target profile, by changing the
708       value that gets substituted for the %realm string.
709      </para>
710     </listitem>
711    </varlistentry>
712    <varlistentry>
713     <term>x-parm</term>
714     <listitem>
715      <para>
716       All parameters that has prefix x, dash are passed verbatim
717       to the backend.
718      </para>
719     </listitem>
720    </varlistentry>
721   </variablelist>
722  </refsect1>
723  <refsect1>
724   <title>SCHEMA</title>
725   <literallayout><xi:include
726   xi:href="../xml/schema/filter_zoom.rnc"
727   xi:parse="text"
728   xmlns:xi="http://www.w3.org/2001/XInclude" />
729   </literallayout>
730  </refsect1>
731
732  <refsect1>
733   <title>EXAMPLES</title>
734   <para>
735    In example below Target definitions (Torus records) are fetched
736    from a web service via a proxy. A CQL profile is configured which
737    maps to a set of CCL fields ("no field", au, tu and su). Presumably
738    the target definitions fetched maps the CCL to their native RPN.
739    A CCL "ocn" is mapped for all targets. Logging of APDUs are enabled,
740    and a timeout is given.
741    <screen><![CDATA[
742     <filter type="zoom">
743       <torus
744          url="http://torus.indexdata.com/src/records/?query=%query"
745          proxy="localhost:3128"
746          />
747       <fieldmap cql="cql.anywhere"/>
748       <fieldmap cql="cql.serverChoice"/>
749       <fieldmap cql="dc.creator" ccl="au"/>
750       <fieldmap cql="dc.title" ccl="ti"/>
751       <fieldmap cql="dc.subject" ccl="su"/>
752
753       <cclmap>
754         <qual name="ocn">
755           <attr type="u" value="12"/>
756           <attr type="s" value="107"/>
757         </qual>
758       </cclmap>
759       <log apdu="true"/>
760       <zoom timeout="40"/>
761     </filter>
762 ]]>
763    </screen>
764   </para>
765
766   <para>
767    Here is another example with two locally defined targets: A
768    Solr target and a Z39.50 target.
769    <screen><![CDATA[
770       </filter>
771       <filter type="zoom">
772         <torus>
773           <records>
774             <record>
775               <udb>ocs-test</udb>
776               <cclmap_term>t=z</cclmap_term>
777               <cclmap_ti>u=title t=z</cclmap_ti>
778               <sru>solr</sru>
779               <zurl>ocs-test.indexdata.com/solr/select</zurl>
780             </record>
781             <record>
782               <udb>loc</udb>
783               <cclmap_term>t=l,r</cclmap_term>
784               <cclmap_ti>u=4 t=l,r</cclmap_ti>
785               <zurl>z3950.loc.gov:7090/voyager</zurl>
786             </record>
787           </records>
788         </torus>
789         <fieldmap cql="cql.serverChoice"/>
790         <fieldmap cql="dc.title" ccl="ti"/>
791       </filter>
792 ]]>
793    </screen>
794   </para>
795  </refsect1>
796
797  <refsect1>
798   <title>SEE ALSO</title>
799   <para>
800    <citerefentry>
801     <refentrytitle>metaproxy</refentrytitle>
802     <manvolnum>1</manvolnum>
803    </citerefentry>
804   </para>
805   <para>
806    <citerefentry>
807     <refentrytitle>virt_db</refentrytitle>
808     <manvolnum>3mp</manvolnum>
809    </citerefentry>
810   </para>
811  </refsect1>
812
813  &copyright;
814 </refentry>
815
816 <!-- Keep this comment at the end of the file
817 Local variables:
818 mode: nxml
819 nxml-child-indent: 1
820 End:
821 -->