<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1//EN"
"http://www.oasis-open.org/docbook/xml/4.1/docbookx.dtd"
[
- <!ENTITY local SYSTEM "local.ent">
+ <!ENTITY % local SYSTEM "local.ent">
+ %local;
<!ENTITY manref SYSTEM "manref.xml">
<!ENTITY progref SYSTEM "progref.xml">
<!ENTITY % common SYSTEM "common/common.ent">
-->
<!NOTATION PDF SYSTEM "PDF">
]>
-<!-- $Id: book.xml,v 1.46 2007-01-05 10:56:17 marc Exp $ -->
+<!-- $Id: book.xml,v 1.55 2007-01-25 10:34:27 adam Exp $ -->
<book id="metaproxy">
<bookinfo>
<title>Metaproxy - User's Guide and Reference</title>
- <author>
- <firstname>Adam</firstname><surname>Dickmeiss</surname>
- </author>
- <author>
- <firstname>Marc</firstname><surname>Cromme</surname>
- </author>
- <author>
- <firstname>Mike</firstname><surname>Taylor</surname>
- </author>
+ <authorgroup>
+ <author>
+ <firstname>Adam</firstname><surname>Dickmeiss</surname>
+ </author>
+ <author>
+ <firstname>Marc</firstname><surname>Cromme</surname>
+ </author>
+ <author>
+ <firstname>Mike</firstname><surname>Taylor</surname>
+ </author>
+ </authorgroup>
+ <releaseinfo>&version;</releaseinfo>
<copyright>
<year>2005-2007</year>
<holder>Index Data ApS</holder>
</copyright>
<abstract>
<simpara>
+ This manual is part of Metaproxy version &version;.
+ </simpara>
+ <simpara>
Metaproxy is a universal router, proxy and encapsulated
metasearcher for information retrieval protocols. It accepts,
processes, interprets and redirects requests from IR clients using
- standard protocols such as
+ standard protocols such as the binary
<ulink url="&url.z39.50;">ANSI/NISO Z39.50</ulink>
- (and in the future <ulink url="&url.sru;">SRU</ulink>
- and <ulink url="&url.srw;">SRW</ulink>), as
+ and the information search and retireval
+ web services <ulink url="&url.sru;">SRU</ulink>
+ and <ulink url="&url.srw;">SRW</ulink>, as
well as functioning as a limited
<ulink url="&url.http;">HTTP</ulink> server.
+ </simpara>
+ <simpara>
Metaproxy is configured by an XML file which
specifies how the software should function in terms of routes that
the request packets can take through the proxy, each step on a
plugins that provide new filters. The filter API is small and
conceptually simple, but there are many details to master. See
the section below on
- <link linkend="extensions">extensions</link>.
+ <link linkend="filters">Filters</link>.
</para>
</listitem>
</varlistentry>
the core Metaproxy binary. This overview is intended to give a
flavor of the available functionality; more detailed information
about each type of filter is included below in
- <link linkend="filterref"
- >the reference guide to Metaproxy filters</link>.
+ <xref linkend="reference"/>.
</para>
<para>
The filters are here named by the string that is used as the
sets Z39.50 packages to Z_Close, and HTTP_Request packages to
HTTP_Response err code 400 packages, and adds a suitable bounce
message.
- The bounce filter is usually added at end of each filter chain
- config.xml to prevent infinite hanging of for example HTTP
+ The bounce filter is usually added at end of each filter chain route
+ to prevent infinite hanging of for example HTTP
requests packages when only the Z39.50 client partial sink
filter is found in the
route.
</section>
<section>
+ <title><literal>cql_rpn</literal>
+ (mp::filter::CQLtoRPN)</title>
+ <para>
+ A query language transforming filter which catches Z39.50
+ <literal>searchRequest</literal>
+ packages containing <literal>CQL</literal> queries, transforms
+ those to <literal>RPN</literal> queries,
+ and sends the <literal>searchRequests</literal> on to the next
+ filters. It is among other things useful in a SRU context.
+ </para>
+ </section>
+
+ <section>
<title><literal>frontend_net</literal>
(mp::filter::FrontendNet)</title>
<para>
<title><literal>http_file</literal>
(mp::filter::HttpFile)</title>
<para>
- A partial sink which swallows only HTTP_Request packages, and
+ A partial sink which swallows only
+ <literal>HTTP_Request</literal> packages, and
returns the contents of files from the local
filesystem in response to HTTP requests.
It lets Z39.50 packages and all other forthcoming package types
<literal>load_balance</literal> filter is assuming that
all backend targets have equal content, and chooses the backend
with least load cost for a new session.
+ <warning>
+ <para>
+ This filter is experimental and yet not mature for heavy load
+ production sites.
+ </para>
+ </warning>
</para>
</section>
<title><literal>query_rewrite</literal>
(mp::filter::QueryRewrite)</title>
<para>
- Rewrites Z39.50 Type-1 and Type-101 (``RPN'') queries by a
+ Rewrites Z39.50 <literal>Type-1</literal>
+ and <literal>Type-101</literal> (``<literal>RPN</literal>'')
+ queries by a
three-step process: the query is transliterated from Z39.50
packet structures into an XML representation; that XML
representation is transformed by an XSLT stylesheet; and the
<title><literal>session_shared</literal>
(mp::filter::SessionShared)</title>
<para>
- When this is finished, it will implement global sharing of
+ This filter implements global sharing of
result sets (i.e. between threads and therefore between
- clients), yielding performance improvements especially when
- incoming requests are from a stateless environment such as a
- web-server, in which the client process representing a session
- might be any one of many. However:
+ clients), yielding performance improvements by clever resource
+ pooling.
</para>
- <warning>
- <para>
- This filter is not yet completed.
- </para>
- </warning>
</section>
<section>
and present requests, and wraps the
received hit counts and XML records into suitable SRU response
messages.
- The <literal>sru_z3950</literal> filter does only process SRU
- GET/POST/SOAP explain requests in a very crude fashion, returning
- the absolute minimum required by the standard. Full ZeeReX
- explain support is added by including the
- <literal>zeerex_explain</literal> filter before the
- <literal>sru_z3950</literal> filter.
+ The <literal>sru_z3950</literal> filter processes also SRU
+ GET/POST/SOAP explain requests, returning
+ either the absolute minimum required by the standard, or a full
+ pre-defined ZeeReX explain record.
+ See the
+ <ulink url="&url.zeerex.explain;">ZeeReX Explain</ulink>
+ standard pages and the
+ <ulink url="&url.sru.explain;">SRU Explain</ulink> pages
+ for more information on the correct explain syntax.
+ SRU scan requests are not supported yet.
</para>
</section>
(mp::filter::ZeerexExplain)</title>
<para>
This filter acts as a sink for
- SRU GET/POST/SOAP explain requests, returning a static ZeeReX
+ Z39.50 explain requests, returning a static ZeeReX
Explain XML record from the config section. All other packages
- are passed through, including SRU GET/POST/SOAP searchRetrieve
- requests, which are handled by a following
- <literal>sru_z3950</literal> filter.
+ are passed through.
See the
<ulink url="&url.zeerex.explain;">ZeeReX Explain</ulink>
- standard pages and the
- <ulink url="&url.sru.explain;">SRU Explain</ulink> pages
+ standard pages
for more information on the correct explain syntax.
</para>
+ <warning>
+ <para>
+ This filter is not yet completed.
+ </para>
+ </warning>
</section>
<para>
If Metaproxy is an interpreter providing operations on packages, then
its configuration file can be thought of as a program for that
- interpreter. Configuration is by means of a single file, the name
+ interpreter. Configuration is by means of a single XML file, the name
of which is supplied as the sole command-line argument to the
<command>metaproxy</command> program. (See
- <link linkend="progref">the reference guide</link>
- below for more information on invoking Metaproxy.)
- </para>
- <para>
- The configuration files are written in XML. (But that's just an
- implementation detail - they could just as well have been written
- in YAML or Lisp-like S-expressions, or in a custom syntax.)
+ <xref linkend="reference"/> below for more information on invoking
+ Metaproxy.)
</para>
</section>
and contain various elements that provide suitable configuration
for a filter of its type. The filter-specific elements are
described in
- <link linkend="filterref">the reference guide below</link>.
+ <xref linkend="reference"/>.
Filters defined in this part of the file must carry an
<literal>id</literal> attribute so that they can be referenced
from elsewhere.
which returns the response to the client.
</para>
</section>
- <section id="checking.xml.syntax">
+
+ <section id="config-file-modularity">
+ <title>Config file modularity</title>
+ <para>
+ Metaproxy XML configuration snippets can be reused by other
+ filters using the <literal>XInclude</literal> standard, as seen in
+ the <literal>/etc/config-sru-to-z3950.xml</literal> example SRU
+ configuration.
+ <screen><![CDATA[
+ <filter id="sru" type="sru_z3950">
+ <database name="Default">
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
+ href="explain.xml"/>
+ </database>
+ </filter>
+]]></screen>
+ </para>
+ </section>
+
+ <section id="config-file-syntax-check">
<title>Config file syntax checking</title>
<para>
The distribution contains RelaxNG Compact and XML syntax checking
</chapter>
+ <chapter id="sru-server">
+ <title>Combined SRU webservice and Z39.50 server configuration</title>
+ <para>
+ Metaproxy can act as
+ <ulink url="&url.sru;">SRU</ulink> and
+ <ulink url="&url.srw;">SRW</ulink>
+ web service server, which translates web service requests to
+ <ulink url="&url.z39.50;">ANSI/NISO Z39.50</ulink> packages and
+ sends them off to common available targets.
+ </para>
+ <para>
+ A typical setup for this operation needs a filter route including the
+ following modules:
+ </para>
+
+ <table id="sru-server-table-config" frame="top">
+ <title>SRU/Z39.50 Server Filter Route Configuration</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Filter</entry>
+ <entry>Importance</entry>
+ <entry>Purpose</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><literal>frontend_net</literal></entry>
+ <entry>required</entry>
+ <entry>Accepting HTTP connections and passing them to following
+ filters. Since this filter also accepts Z39.50 connections, the
+ server works as SRU and Z39.50 server on the same port.</entry>
+ </row>
+ <row>
+ <entry><literal>sru_z3950</literal></entry>
+ <entry>required</entry>
+ <entry>Accepting SRU GET/POST/SOAP explain and
+ searchRetrieve requests for the the configured databases.
+ Explain requests are directly served from the static XML configuration.
+ SearchRetrieve requests are
+ transformed to Z39.50 search and present packages.
+ All other HTTP and Z39.50 packages are passed unaltered.</entry>
+ </row>
+ <row>
+ <entry><literal>http_file</literal></entry>
+ <entry>optional</entry>
+ <entry>Serving HTTP requests from the filesystem. This is only
+ needed if the server should serve XSLT stylesheets, static HTML
+ files or Java Script for thin browser based clients.
+ Z39.50 packages are passed unaltered.</entry>
+ </row>
+ <row>
+ <entry><literal>cql_rpn</literal></entry>
+ <entry>required</entry>
+ <entry>Usually, Z39.50 servers do not talk CQL, hence the
+ translation of the CQL query language to RPN is mandatory in
+ most cases. Affects only Z39.50 search packages.</entry>
+ </row>
+ <row>
+ <entry><literal>record_transform</literal></entry>
+ <entry>optional</entry>
+ <entry>Some Z39.50 backend targets can not present XML record
+ syntaxes in common wanted element sets. using this filter, one
+ can transform binary MARC records to MARCXML records, and
+ further transform those to any needed XML schema/format by XSLT
+ transformations. Changes only Z39.50 present packages.</entry>
+ </row>
+ <row>
+ <entry><literal>session_shared</literal></entry>
+ <entry>optional</entry>
+ <entry>The stateless nature of web services requires frequent
+ re-searching of the same targets for display of paged result set
+ records. This might be an unacceptable burden for the accessed
+ backend Z39.50 targets, and this mosule can be added for
+ efficient backend target resource pooling.</entry>
+ </row>
+ <row>
+ <entry><literal>z3950_client</literal></entry>
+ <entry>required</entry>
+ <entry>Finally, a Z39.50 package sink is needed in the filter
+ chain to provide the response packages. The Z39.50 client module
+ is used to access external targets over the network, but any
+ coming local Z39.50 package sink could be used instead of.</entry>
+ </row>
+ <row>
+ <entry><literal>bounce</literal></entry>
+ <entry>required</entry>
+ <entry>Any Metaproxy package arriving here did not do so by
+ purpose, and is bounced back with connection closure. this
+ prevents inifinite package hanging inside the SRU server.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ A typical minimal example <ulink url="&url.sru;">SRU</ulink> and
+ <ulink url="&url.srw;">SRW</ulink> server configuration file is found
+ in the tarball distribution at
+ <literal>etc/config-sru-to-z3950.xml</literal>.
+ </para>
+ <para>
+ Off course, any other metaproxy modules can be integrated into a
+ SRU server solution, including, but not limited to, load balancing,
+ multiple target querying
+ (see <xref linkend="multidb"/>), and complex RPN query rewrites.
+ </para>
+
+
+ </chapter>
+ <!--
<chapter id="extensions">
<title>Writing extensions for Metaproxy</title>
<para>### To be written</para>
</chapter>
-
+ -->
<para>
<emphasis>Stop! Do not read this!</emphasis>
You won't enjoy it at all. You should just skip ahead to
- <link linkend="refguide">the reference guide</link>,
+ <xref linkend="reference"/>,
which tells
<!-- The remainder of this paragraph is lifted verbatim from
Douglas Adams' _Hitch Hiker's Guide to the Galaxy_, chapter 8 -->
</chapter>
-
- <reference id="refguide">
- <title>Reference guide</title>
+ <reference id="reference">
+ <title>Reference</title>
+ <partintro>
<para>
The material in this chapter is drawn directly from the individual
manual entries. In particular, the Metaproxy invocation section is
on each individual filter is available using the name of the filter
as the argument to the <command>man</command> command.
</para>
- &manref;
+ </partintro>
+ &manref;
</reference>
</book>