Work.
[idzebra-moved-to-github.git] / doc / zebra.sgml
1 <!doctype linuxdoc system>
2
3 <!--
4   $Id: zebra.sgml,v 1.26 1996-05-13 10:20:17 quinn Exp $
5 -->
6
7 <article>
8 <title>Zebra Server - Administrators's Guide and Reference
9 <author><htmlurl url="http://www.indexdata.dk/" name="Index Data">, <tt><htmlurl url="mailto:info@index.ping.dk" name="info@index.ping.dk"></>
10 <date>$Revision: 1.26 $
11 <abstract>
12 The Zebra information server combines a versatile fielded/free-text
13 search engine with a Z39.50-1995 frontend to provide a powerful and flexible
14 information management system. This document explains the procedure for
15 installing and configuring the system, and outlines the possibilities
16 for managing data and providing Z39.50
17 services with the software.
18 </abstract>
19
20 <toc>
21
22 <sect>Introduction
23
24 <sect1>Overview
25
26 <p>
27 The Zebra system is a fielded free-text indexing and retrieval engine with a
28 Z39.50 frontend. You can use any commercial or freeware Z39.50 client
29 to access data stored in Zebra.
30
31 The Zebra server is our first step towards the development of a fully
32 configurable, open information system. Eventually, it will be paired
33 off with a powerful Z39.50 client to support complex information
34 management tasks within almost any application domain. We're making
35 the server available now because it's no fun to be in the open
36 information retrieval business all by yourself. We want to allow
37 people with interesting data to make their things
38 available in interesting ways, without having to start out
39 by implementing yet another protocol stack from scratch.
40
41 This document is an introduction to the Zebra system. It will tell you
42 how to compile the software, and how to prepare your first database.
43 It also explains how the server can be configured to give you the
44 functionality that you need.
45
46 If you find the software interesting, you should join the support
47 mailing-list by sending Email to <tt/zebra-request@index.ping.dk/.
48
49 <sect1>Features
50
51 <p>
52 This is a listof some of the most important features of the
53 system.
54
55 <itemize>
56
57 <item>
58 Supports updating - records can be added and deleted without
59 rebuilding the index from scratch.
60 The update procedure is tolerant to crashes or hard interrupts
61 during register updating - registers can be reconstructed following a crash.
62 Registers can be safely updated even while users are accessing the server.
63
64 <item>
65 Supports large databases - files for indices, etc. can be
66 automatically partitioned over multiple disks.
67
68 <item>
69 Supports arbitrarily complex records - base input format is an
70 SGML-like syntax which allows nested (structured) data elements, as
71 well as variant forms of data.
72
73 <item>
74 Supports random storage formats. A system of input filters driven by
75 regular expressions allows you to easily process most ASCII-based
76 data formats.
77
78 <item>
79 Supports boolean queries as well as relevance-ranking (free-text)
80 searching. Right truncation and masking in terms are supported, as
81 well as full regular expressions.
82
83 <item>
84 Supports multiple concrete syntaxes
85 for record exchange (depending on the configuration): GRS-1, SUTRS,
86 ISO2709 (*MARC). Records can be mapped between record syntaxes and
87 schema on the fly.
88
89 <item>
90 Supports approximate matching in registers (ie. spelling mistakes,
91 etc).
92
93 <item>
94 Protocol support:
95
96 <itemize>
97
98 <item>
99 Protocol facilities: Init, Search, Retrieve, Browse.
100
101 <item>
102 Piggy-backed presents are honored in the search-request.
103
104 <item>
105 Named result sets are supported.
106
107 <item>
108 Easily configured to support different application profiles, with
109 tables for attribute sets, tag sets, and abstract syntaxes.
110 Additional tables control facilities such as element mappings to
111 different schema (eg., GILS-to-USMARC).
112
113 <item>
114 Complex composition specifications using Espec-1 are partially
115 supported (simple element requests only).
116
117 <item>
118 Element Set Names are defined using the Espec-1 capability of the
119 system, and are given in configuration files as simple element
120 requests (and possibly variant requests).
121
122 <item>
123 Some variant support (not fully implemented yet).
124
125 <item>
126 Using the YAZ toolkit for the protocol implementation, the
127 server can utilise a plug-in XTI/mOSI implementation (not included) to
128 provide SR services over an OSI stack, as well as Z39.50 over TCP/IP.
129
130 </itemize>
131
132 </itemize>
133
134 <sect1>Future Work
135
136 <p>
137 This is an alfa-release of the software, to allow you to look at
138 it - try it out, and assess whether it can be of use to you. We expect
139 this version to be followed by a succession of beta-releases until we
140 arrive at a stable first version.
141
142 These are some of the plans that we have for the software in the near
143 and far future, approximately ordered after their relative importance.
144 Items marked with an
145 asterisk will be implemented before the
146 last beta release.
147
148 <itemize>
149
150 <item>
151 *Complete the support for variants. Finalize support for the WAIS
152 retrieval methodology.
153
154 <item>
155 *Finalize the data element <it/include/ facility to support multimedia
156 data elements in records.
157
158 <item>
159 *Port the system to Windows NT.
160
161 <item>
162 Add index and data compression to save disk space.
163
164 <item>
165 Add more sophisticated relevance ranking mechanisms. Add support for soundex
166 and stemming. Add relevance <it/feedback/ support.
167
168 <item>
169 Add Explain support.
170
171 <item>
172 Add support for very large records by implementing segmentation and/or
173 variant pieces.
174
175 <item>
176 Support the Item Update extended service of the protocol.
177
178 <item>
179 We want to add a management system that allows you to
180 control your databases and configuration tables from a graphical
181 interface. We'll probably use Tcl/Tk to stay platform-independent.
182
183 </itemize>
184
185 Programmers thrive on user feedback. If you are interested in a facility that
186 you don't see mentioned here, or if there's something you think we
187 could do better, please drop us a mail. If you think it's all really
188 neat, you're welcome to drop us a line saying that, too. You'll find
189 contact info at the end of this file.
190
191 <sect>Compiling the software
192
193 <p>
194 An ANSI C compiler is required to compile the Zebra
195 server system &mdash; <tt/gcc/ works fine if your own system doesn't
196 provide an adequate compiler.
197
198 Unpack the distribution archive. In some cases, you may want to edit
199 the top-level <tt/Makefile/, eg. to select a different C compiler, or
200 to specify machine-specific libraries in the <bf/NETLIB/ variable.
201
202 When you are done editing the <tt>Makefile</tt> type:
203 <tscreen><verb>
204 $ make
205 </verb></tscreen>
206
207 If successful, two executables have been created in the sub-directory
208 <tt/index/.
209 <descrip>
210 <tag><tt>zebrasrv</tt></tag> The Z39.50 server and search engine.
211 <tag><tt>zebraidx</tt></tag> The administrative tool for the search index.
212 </descrip>
213
214 <sect>Quick Start 
215 <p>
216 In this section, we will test the system by indexing a small set of sample
217 GILS records that are included with the software distribution. Go to the
218 <tt>test</tt> subdirectory of the distribution archive. There you will
219 find a configuration
220 file named <tt>zebra.cfg</tt> with the following contents:
221 <tscreen><verb>
222 # Where are the YAZ tables located.
223 profilePath: ../../yaz/tab ../tab
224
225 # Files that describe the attribute sets supported.
226 attset: bib1.att
227 attset: gils.att
228 </verb></tscreen>
229
230 Now, edit the file and set <tt>profilePath</tt> to the path of the
231 YAZ profile tables (sub directory <tt>tab</tt> of the YAZ distribution
232 archive).
233
234 The 48 test records are located in the sub directory <tt>records</tt>.
235 To index these, type:
236 <tscreen><verb>
237 $ ../index/zebraidx -t grs update records
238 </verb></tscreen>
239
240 In the command above the option <tt>-t</tt> specified the record
241 type &mdash; in this case <tt>grs</tt>. The word <tt>update</tt> followed
242 by a directory root updates all files below that directory node.
243
244 If your indexing command was successful, you are now ready to
245 fire up a server. To start a server on port 2100, type:
246 <tscreen><verb>
247 $ ../index/zebrasrv tcp:@:2100
248 </verb></tscreen>
249
250 The Zebra index that you have just created has a single database
251 named <tt/Default/. The database contains records structured according to
252 the GILS profile, and the server will
253 return records in either either USMARC, GRS-1, or SUTRS depending
254 on what your client asks
255 for.
256
257 To test the server, you can use any Z39.50 client (1992 or later). For
258 instance, you can use the demo client that comes with YAZ: Just cd to
259 the <tt/client/ subdirectory of the YAZ distribution and type:
260
261 <tscreen><verb>
262 $ client tcp:localhost:2100
263 </verb></tscreen>
264
265 When the client has connected, you can type:
266
267 <tscreen><verb>
268 Z> find surficial
269 Z> show 1
270 </verb></tscreen>
271
272 The default retrieval syntax for the client is USMARC. To try other
273 formats for the same record, try:
274
275 <tscreen><verb>
276 Z>format sutrs
277 Z>show 1
278 Z>format grs-1
279 Z>show 1
280 Z>elements B
281 Z>show 1
282 </verb></tscreen>
283
284 <it>NOTE: You may notice that more fields are returned when your
285 client requests SUTRS or GRS-1 records. When retrieving GILS records,
286 this is normal - not all of the GILS data elements have mappings in
287 the USMARC record format.</it>
288
289 If you've made it this far, there's a good chance that
290 you've got through the compilation OK.
291
292 <sect>Administrating Zebra<label id="administrating">
293
294 <p>
295 Unlike many simpler retrieval systems, Zebra supports safe, incremental
296 updates to an existing index.
297
298 Normally, when Zebra modifies the index it reads a number of records
299 that you specify.
300 Depending on your specifications and on the contents of each record
301 one the following events take place for each record:
302 <descrip>
303 <tag>Insert</tag> The record is indexed as if it never occurred
304 before. Either the Zebra system doesn't know how to identify the record or
305 Zebra can identify the record but didn't find it to be already indexed.
306 <tag>Modify</tag> The record has already been indexed. In this case
307 either the contents of the record or the location (file) of the record
308 indicates that it has been indexed before.
309 <tag>Delete</tag> The record is deleted from the index. As in the
310 update-case it must be able to identify the record.
311 </descrip>
312
313 Please note that in both the modify- and delete- case the Zebra
314 indexer must be able to generate a unique key that identifies the record in
315 question (more on this below).
316
317 To administrate the Zebra retrieval system, you run the
318 <tt>zebraidx</tt> program. This program supports a number of options
319 which are preceded by a minus, and a few commands (not preceded by
320 minus).
321
322 Both the Zebra administrative tool and the Z39.50 server share a
323 set of index files and a global configuration file. The
324 name of the configuration file defaults to <tt>zebra.cfg</tt>.
325 The configuration file includes specifications on how to index
326 various kinds of records and where the other configuration files
327 are located. <tt>zebrasrv</tt> and <tt>zebraidx</tt> <em>must</em>
328 be run in the directory where the configuration file lives unless you
329 indicate the location of the configuration file by option
330 <tt>-c</tt>.
331
332 <sect1>Record Types<label id="record-types">
333 <p>
334 Indexing is a per-record process, in which
335 either insert/modify/delete will occur. Before a record is indexed
336 search keys are extracted from whatever might be the layout the
337 original record (sgml,html,text, etc..). The Zebra system 
338 currently only supports SGML-like, structured records and unstructured text
339 records.
340 To specify a particular extraction process, use either the
341 command line option <tt>-t</tt> or specify a
342 <tt>recordType</tt> setting in the configuration file.
343
344 <sect1>The Zebra Configuration File<label id="configuration-file">
345 <p>
346 The Zebra configuration file, read by <tt>zebraidx</tt> and
347 <tt>zebrasrv</tt> defaults to <tt>zebra.cfg</tt> unless specified
348 by <tt>-c</tt> option.
349
350 You can edit the configuration file with a normal text editor.
351 Parameter names and values are seperated by colons in the file. Lines
352 starting with a hash sign (<tt/&num;/) are treated as comments.
353
354 If you manage different sets of records that share common
355 characteristics, you can organize the configuration settings for each
356 type into &dquot;groups&dquot;.
357 When <tt>zebraidx</tt> is run and you wish to address a given group
358 you specify the group name with the <tt>-g</tt> option. In this case
359 settings that have the group name as their prefix will be used
360 by <tt>zebraidx</tt>. If no <tt/-g/ option is specified, the settings
361 with no prefix are used.
362
363 In the configuration file, the group name is placed before the option
364 name
365 itself, separated by a dot (.). For instance, to set the record type
366 for group <tt/public/ to <tt/grs/ (the common format for structured
367 records) you would write:
368
369 <tscreen><verb>
370 public.recordType: grs
371 </verb></tscreen>
372
373 To set the default value of the record type to <tt/text/ write:
374
375 <tscreen><verb>
376 recordType: text
377 </verb></tscreen>
378
379 The available configuration settings are summarized below. They will be
380 explained further in the following sections.
381
382 <descrip>
383 <tag><it>group</it>.recordType&lsqb;<it>.name</it>&rsqb;</tag>
384  Specifies how records with the file extension <it>name</it> should
385  be handled by the indexer. This option may also be specified
386  as a command line option (<tt>-t</tt>). Note that if you do not
387  specify a <it/name/, the setting applies to all files.
388 <tag><it>group</it>.recordId</tag>
389  Specifies how the records are to be identified when updated. See
390 section <ref id="locating-records" name="Locating Records">.
391 <tag><it>group</it>.database</tag>
392  Specifies the Z39.50 database name.
393 <tag><it>group</it>.storeKeys</tag>
394  Specifies whether key information should be saved for a given
395  group of records. If you plan to update/delete this type of
396  records later this should be specified as 1; otherwise it
397  should be 0 (default), to save register space. See section
398 <ref id="file-ids" name="Indexing With File Record IDs">.
399 <tag><it>group</it>.storeData</tag>
400  Specifies whether the records should be stored internally
401  in the Zebra system files. If you want to maintain the raw records yourself,
402  this option should be false (0). If you want Zebra to take care of the records
403  for you, it should be true(1).
404 <tag>register</tag> 
405  Specifies the location of the various register files that Zebra uses
406  to represent your databases. See section
407 <ref id="register-location" name="Register Location">.
408 <tag>shadow</tag>
409  Enables the <it/safe update/ facility of Zebra, and tells the system
410  where to place the required, temporary files. See section
411 <ref id="shadow-registers" name="Safe Updating - Using Shadow Registers">.
412 <tag>lockPath</tag>
413  Directory in which various lock files are stored.
414 <tag>tempSetPath</tag>
415  Specifies the directory that the server uses for temporary result sets.
416  If not specified <tt>/tmp</tt> will be used.
417 <tag>profilePath</tag>
418  Specifies the location of profile specification files.
419 <tag>attset</tag> 
420  Specifies the filename(s) of attribute set files for use in
421  searching. At least the Bib-1 set should be loaded (<tt/bib1.att/).
422  The <tt/profilePath/ setting is used to look for the specified files.
423  See section <ref id="attset-files" name="The Attribute Set Files">
424 </descrip>
425
426 <sect1>Locating Records<label id="locating-records">
427 <p>
428 The default behaviour of the Zebra system is to reference the
429 records from their original location, i.e. where they were found when you
430 ran <tt/zebraidx/. That is, when a client wishes to retrieve a record
431 following a search operation, the files are accessed from the place
432 where you originally put them - if you remove the files (without
433 running <tt/zebraidx/ again, the client will receive a diagnostic
434 message.
435
436 If your input files are not permanent - for example if you retrieve
437 your records from an outside source, or if they were temporarily
438 mounted on a CD-ROM drive,
439 you may want Zebra to make an internal copy of them. To do this,
440 you specify 1 (true) in the <tt>storeData</tt> setting. When
441 the Z39.50 server retrieves the records they will be read from the
442 internal file structures of the system.
443
444 <sect1>Indexing with no Record IDs (Simple Indexing)
445
446 <p>
447 If you have a set of records that is not expected to change over time
448 you may can build your database without record IDs.
449 This indexing method uses less space than the other methods and
450 is simple to use. 
451
452 To use this method, you simply don't provide the <tt>recordId</tt> entry
453 for the group of files that you index. To add a set of records you use
454 <tt>zebraidx</tt> with the <tt>update</tt> command. The
455 <tt>update</tt> command will always add all of the records that it
456 encounters to the index - whether they have already been indexed or
457 not. If the set of indexed files change, you should delete all of the
458 index files, and build a new index from scratch.
459
460 Consider a system in which you have a group of text files called
461 <tt>simple</tt>. That group of records should belong to a Z39.50 database
462 called <tt>textbase</tt>. The following <tt/zebra.cfg/ file will suffice:
463
464 <tscreen><verb>
465 profilePath: /usr/local/yaz
466 attset: bib1.att
467 simple.recordType: text
468 simple.database: textbase
469 </verb></tscreen>
470
471 Since the existing records in an index can not be addressed by their
472 IDs, it is impossible to delete or modify records when using this method.
473
474 <sect1>Indexing with File Record IDs<label id="file-ids">
475
476 <p>
477 If you have a set of files that regularly change over time: Old files
478 are deleted, new ones are added, or existing files are modified, you
479 can benefit from using the <it/file ID/ indexing methodology. Examples
480 of this type of database might include an index of WWW resources, or a
481 USENET news spool area. Briefly speaking, the file key methodology
482 uses the directory paths of the individual records as a unique
483 identifier for each record. To perform indexing of a directory with
484 file keys, again, you specify the top-level directory after the
485 <tt>update</tt> command. The command will recursively traverse the
486 directories and compare each one with whatever have been indexed before in
487 that same directory. If a file is new (not in the previous version of
488 the directory) it is inserted into the registers; if a file was
489 already indexed and it has been modified since the last update,
490 the index is also modified; if a file has been removed since the last
491 visit, it is deleted from the index.
492
493 The resulting system is easy to administrate. To delete a record you
494 simply have to delete the corresponding file (say, with the <tt/rm/
495 command). And to add records you create new files (or directories with
496 files). For your changes to take effect in the register you must run
497 <tt>zebraidx update</tt> with the same directory root again. This mode
498 of operation requires more disk space than simpler indexing methods,
499 but it makes it easier for you to keep the index in sync with a
500 frequently changing set of data. If you combine this system with the
501 <it/safe update/ facility (see below), you never have to take your
502 server offline for maintenance or register updating purposes.
503
504 To enable indexing with pathname IDs, you must specify <tt>file</tt> as
505 the value of <tt>recordId</tt> in the configuration file. In addition,
506 you should set <tt>storeKeys</tt> to <tt>1</tt>, since the Zebra
507 indexer must save additional information about the contents of each record
508 in order to modify the indices correctly at a later time.
509
510 For example, to update records of group <tt>esdd</tt> located below
511 <tt>/data1/records/</tt> you should type:
512 <tscreen><verb>
513 $ zebraidx -g esdd update /data1/records
514 </verb></tscreen>
515
516 The corresponding configuration file includes:
517 <tscreen><verb>
518 esdd.recordId: file
519 esdd.recordType: grs
520 esdd.storeKeys: 1
521 </verb></tscreen>
522
523 <em>Important note: You cannot start out with a group of records with simple
524 indexing (no record IDs as in the previous section) and then later
525 enable file record Ids. Zebra must know from the first time that you
526 index the group that
527 the files should be indexed with file record IDs.
528 </em>
529
530 You cannot explicitly delete records when using this method (using the
531 <bf/delete/ command to <tt/zebraidx/. Instead
532 you have to delete the files from the file system (or move them to a
533 different location)
534 and then run <tt>zebraidx</tt> with the <bf/update/ command.
535
536 <sect1>Indexing with General Record IDs
537 <p>
538 When using this method you construct an (almost) arbritrary, internal
539 record key based on the contents of the record itself and other system
540 information. If you have a group of records that explicitly associates
541 an ID with each record, this method is convenient. For example, the
542 record format may contain a title or a ID-number - unique within the group.
543 In either case you specify the Z39.50 attribute set and use-attribute
544 location in which this information is stored, and the system looks at
545 that field to determine the identity of the record.
546
547 As before, the record ID is defined by the <tt>recordId</tt> setting
548 in the configuration file. The value of the record ID specification
549 consists of one or more tokens separated by whitespace. The resulting
550 ID is
551 represented in the index by concatenating the tokens and separating them by
552 ASCII value (1).
553
554 There are three kinds of tokens:
555 <descrip>
556 <tag>Internal record info</tag> The token refers to a key that is
557 extracted from the record. The syntax of this token is
558  <tt/(/ <em/set/ <tt/,/ <em/use/ <tt/)/, where <em/set/ is the
559 attribute set ordinal number and <em/use/ is the use value of the attribute.
560 <tag>System variable</tag> The system variables are preceded by
561 <verb>$</verb> and immediately followed by the system variable name, which
562 may one of
563  <descrip>
564  <tag>group</tag> Group name.
565  <tag>database</tag> Current database specified.
566  <tag>type</tag> Record type.
567  </descrip>
568 <tag>Constant string</tag> A string used as part of the ID &mdash; surrounded
569  by single- or double quotes.
570 </descrip>
571
572 For instance, the sample GILS records that come with the Zebra
573 distribution contain a
574 unique ID
575 in the Control-Identifier field. This field is mapped to the Bib-1
576 use attribute 1007. To use this field as a record id, specify
577 <tt>(1,1007)</tt> as the value of the <tt>recordId</tt> in the
578 configuration file. If you have other record types that uses
579 the same field for a different purpose, you might add the record type (or group or database name)
580 to the record id of the gils records as well, to prevent matches
581 with other types of records. In this case the recordId might be
582 set like this:
583 <tscreen><verb>
584 gils.recordId: $type (1,1007)
585 </verb></tscreen>
586
587 (see section <ref id="data-model" name="Configuring Your Data Model">
588 for details of how the mapping between elements of your records and
589 searchable attributes is established).
590
591 As for the file record ID case described in the previous section,
592 updating your system is simply a matter of running <tt>zebraidx</tt>
593 with the <tt>update</tt> command. However, the update with general
594 keys is considerably slower than with file record IDs, since all files
595 visited must be (re)read to discover their IDs. 
596
597 As you might expect, when using the general record IDs
598 method, you can only add or modify existing records with the <tt>update</tt>
599 command. If you wish to delete records, you must use the,
600 <tt>delete</tt> command, with a directory as a parameter.
601 This will remove all records that match the files below that root
602 directory.
603
604 <sect1>Register Location<label id="register-location">
605
606 <p>
607 Normally, the index files that form dictionaries, inverted
608 files, record info, etc., are stored in the directory where you run
609 <tt>zebraidx</tt>. If you wish to store these, possibly large, files
610 somewhere else, you must add the <tt>register</tt> entry to the
611 <tt/zebra.cfg/ file. Furthermore, the Zebra system allows its file
612 structures to
613 span multiple file systems, which is useful for managing very large
614 databases. 
615
616 The value of the <tt>register</tt> setting is a sequence of tokens.
617 Each token takes the form:
618 <tscreen>
619 <em>dir</em><tt>:</tt><em>size</em>. 
620 </tscreen>
621 The <em>dir</em> specifies a directory in which index files will be
622 stored and the <em>size</em> specifies the maximum size of all
623 files in that directory. The Zebra indexer system fills each directory
624 in the order specified and use the next specified directories as needed.
625 The <em>size</em> is an integer followed by a qualifier
626 code, <tt>M</tt> for megabytes, <tt>k</tt> for kilobytes.
627
628 For instance, if you have allocated two disks for your register, and
629 the first disk is mounted
630 on <tt>/d1</tt> and has 200 Mb of free space and the
631 second, mounted on <tt>/d2</tt> has 300 Mb, you could
632 put this entry in your configuration file:
633 <tscreen><verb>
634 register: /d1:200M /d2:300M
635 </verb></tscreen>
636
637 Note that Zebra does not verify that the amount of space specified is
638 actually available on the directory (file system) specified - it is
639 your responsibility to ensure that enough space is available, and that
640 other applications do not attempt to use the free space. In a large production system,
641 it is recommended that you allocate one or more filesystem exclusively
642 to the Zebra register files.
643
644 <sect1>Safe Updating - Using Shadow Registers<label id="shadow-registers">
645
646 <sect2>Description
647
648 <p>
649 The Zebra server supports <it/updating/ of the index structures. That is,
650 you can add, modify, or remove records from databases managed by Zebra
651 without rebuilding the entire index. Since this process involves
652 modifying structured files with various references between blocks of
653 data in the files, the update process is inherently sensitive to
654 system crashes, or to process interruptions: Anything but a
655 successfully completed update process will leave the register files in
656 an unknown state, and you will essentially have no recourse but to
657 re-index everything, or to restore the register files from a backup
658 medium. Further, while the update process is active, users cannot be
659 allowed to access the system, as the contents of the register files
660 may change unpredictably.
661
662 You can solve these problems by enabling the shadow register system in
663 Zebra. During the updating procedure, <tt/zebraidx/ will temporarily
664 write changes to the involved files in a set of &dquot;shadow
665 files&dquot;, without modifying the files that are accessed by the
666 active server processes. If the update procedure is interrupted by a
667 system crash or a signal, you simply repeat the procedure - the
668 register files have not been changed or damaged, and the partially
669 written shadow files are automatically deleted before the new updating
670 procedure commences.
671
672 At the end of the updating procedure (or in a separate operation, if
673 you so desire), the system enters a &dquot;commit mode&dquot;. First,
674 any active server processes are forced to access those blocks that
675 have been changed from the shadow files rather than from the main
676 register files; the unmodified blocks are still accessed at their
677 normal location (the shadow files are not a complete copy of the
678 register files - they only contain those parts that have actually been
679 modified). If the commit process is interrupted at any point during the
680 commit process, the server processes will continue to access the
681 shadow files until you can repeat the commit procedure and complete
682 the writing of data to the main register files. You can perform
683 multiple update operations to the registers before you commit the
684 changes to the system files, or you can execute the commit operation
685 at the end of each update operation. When the commit phase has
686 completed successfully, any running server processes are instructed to
687 switch their operations to the new, operational register, and the
688 temporary shadow files are deleted.
689
690 <sect2>How to Use Shadow Register Files
691
692 <p>
693 The first step is to allocate space on your system for the shadow
694 files. You do this by adding a <tt/shadow/ entry to the <tt/zebra.cfg/
695 file. The syntax of the <tt/shadow/ entry is exactly the same as for
696 the <tt/register/ entry (see section <ref name="Register Location"
697 id="register-location">). The location of the shadow area should be
698 <it/different/ from the location of the main register area (if you
699 have specified one - remember that if you provide no <tt/register/
700 setting, the default register area is the
701 working directory of the server and indexing processes).
702
703 The following excerpt from a <tt/zebra.cfg/ file shows one example of
704 a setup that configures both the main register location and the shadow
705 file area. Note that two directories or partitions have been set aside
706 for the shadow file area. You can specify any number of directories
707 for each of the file areas, but remember that there should be no
708 overlaps between the directories used for the main registers and the
709 shadow files, respectively.
710
711 <tscreen><verb>
712 register: /d1:500M
713
714 shadow: /scratch1:100M /scratch2:200M
715 </verb></tscreen>
716
717 When shadow files are enabled, an extra command is available at the
718 <tt/zebraidx/ command line. In order to make changes to the system
719 take effect for the users, you'll have to submit a
720 &dquot;commit&dquot; command after a (sequence of) update
721 operation(s). You can ask the indexer to commit the changes
722 immediately after the update operation:
723
724 <tscreen><verb>
725 $ zebraidx update /d1/records update /d2/more-records commit
726 </verb></tscreen>
727
728 Or you can execute multiple updates before committing the changes:
729
730 <tscreen><verb>
731 $ zebraidx -g books update /d1/records update /d2/more-records
732 $ zebraidx -g fun update /d3/fun-records
733 $ zebraidx commit
734 </verb></tscreen>
735
736 If one of the update operations above had been interrupted, the commit
737 operation on the last line would fail: <tt/zebraidx/ will not let you
738 commit changes that would destroy the running register. You'll have to
739 rerun all of the update operations since your last commit operation,
740 before you can commit the new changes.
741
742 Similarly, if the commit operation fails, <tt/zebraidx/ will not let
743 you start a new update operation before you have successfully repeated
744 the commit operation. The server processes will keep accessing the
745 shadow files rather than the (possibly damaged) blocks of the main
746 register files until the commit operation has successfully completed.
747
748 You should be aware that update operations may take slightly longer
749 when the shadow register system is enabled, since more file access
750 operations are involved. Further, while the disk space required for
751 the shadow register data is modest for a small update operation, you
752 may prefer to disable the system if you are adding a very large number
753 of records to an already very large database (we use the terms
754 <it/large/ and <it/modest/ very loosely here, since every
755 application will have a different perception of size). To update the system
756 without the use of the the shadow files, simply run <tt/zebraidx/ with
757 the <tt/-n/ option (note that you do not have to execute the
758 <bf/commit/ command of <tt/zebraidx/ when you temporarily disable the
759 use of the shadow registers in this fashion. Note also that, just as
760 when the shadow registers are not enabled, server processes will be
761 barred from accessing the main register while the update procedure
762 takes place.
763
764 <sect>Running the Maintenance Interface (zebraidx)
765
766 <p>
767 The following is a complete reference to the command line interface to
768 the <tt/zebraidx/ application.
769
770 <bf/Syntax/
771 <tscreen><verb>
772 $ zebraidx &lsqb;options&rsqb; command &lsqb;directory&rsqb; ...
773 </verb></tscreen>
774 <bf/Options/
775 <descrip>
776 <tag>-t <it/type/</tag>Update all files as <it/type/. Currently, the
777 types supported are <tt/text/ and <tt/grs/<it/.filter/. If no
778 <it/filter/ is provided for the GRS (General Record Structure) type,
779 the canonical input format is assumed (see section <ref
780 id="local-representation" name="Local Representation">). Generally, it
781 is probably advisable to specify the record types in the
782 <tt/zebra.cfg/ file (see section <ref id="record-types" name="Record Types">).
783
784 <tag>-c <it/config-file/</tag>Read the configuration file
785 <it/config-file/ instead of <tt/zebra.cfg/.
786
787 <tag>-g <it/group/</tag>Update the files according to the group
788 settings for <it/group/ (see section <ref id="configuration-file"
789 name="The Zebra Configuration File">).
790
791 <tag>-d <it/database/</tag>The records located should be associated
792 with the database name <it/database/ for access through the Z39.50
793 server.
794
795 <tag>-d <it/mbytes/</tag>Use <it/mbytes/ of megabytes before flushing
796 keys to background storage. This setting affects performance when
797 updating large databases.
798
799 <tag>-n</tag>Disable the use of shadow registers for this operation
800 (see section <ref id="shadow-registers" name="Robust Updating - Using
801 Shadow Registers">).
802
803 <tag>-v <it/level/</tag>Set the log level to <it/level/. <it/level/
804 should be one of <tt/none/, <tt/debug/, and <tt/all/.
805
806 </descrip>
807
808 <bf/Commands/
809 <descrip>
810 <tag>Update <it/directory/</tag>Update the register with the files
811 contained in <it/directory/. If no directory is provided, a list of
812 files is read from <tt/stdin/. See section <ref
813 id="administrating" name="Administrating Zebra">.
814
815 <tag>Delete <it/directory/</tag>Remove the records corresponding to
816 the files found under <it/directory/ from the register.
817
818 <tag/Commit/Write the changes resulting from the last <bf/update/
819 commands to the register. This command is only available if the use of
820 shadow register files is enabled (see section <ref
821 id="shadow-registers" name="Robust Updating - Using Shadow
822 Registers">).
823
824 </descrip>
825
826 <sect>The Z39.50 Server
827
828 <sect1>Running the Z39.50 Server (zebrasrv)
829
830 <p>
831 <bf/Syntax/
832 <tscreen><verb>
833 zebrasrv &lsqb;options&rsqb; &lsqb;listener-address ...&rsqb;
834 </verb></tscreen>
835
836 <bf/Options/
837 <descrip>
838 <tag>-a <it/APDU file/</tag> Specify a file for dumping PDUs (for diagnostic purposes).
839 The special name &dquot;-&dquot; sends output to <tt/stderr/.
840
841 <tag>-c <it/config-file/</tag> Read configuration information from <it/config-file/. The default configuration is <tt>./zebra.cfg</tt>.
842
843 <tag/-S/Don't fork on connection requests. This can be useful for
844 symbolic-level debugging. The server can only accept a single
845 connection in this mode.
846
847 <tag/-s/Use the SR protocol.
848
849 <tag/-z/Use the Z39.50 protocol (default). These two options complement
850 eachother. You can use both multiple times on the same command
851 line, between listener-specifications (see below). This way, you
852 can set up the server to listen for connections in both protocols
853 concurrently, on different local ports.
854
855 <tag>-l <it/logfile/</tag>Specify an output file for the diagnostic
856 messages. The default is to write this information to <tt/stderr/.
857
858 <tag>-v <it/log-level/</tag>The log level. Use a comma-separated list of members of the set
859 {fatal,debug,warn,log,all,none}.
860
861 <tag>-u <it/username/</tag>Set user ID. Sets the real UID of the server process to that of the
862 given <it/username/. It's useful if you aren't comfortable with having the
863 server run as root, but you need to start it as such to bind a
864 privileged port.
865
866 <tag>-w <it/working-directory/</tag>Change working directory.
867
868 <tag>-i <it/minutes/</tag>Run under the Internet superserver, <tt/inetd/.
869
870 <tag>-t <it/timeout/</tag>Set the idle session timeout (default 60 minutes).
871
872 <tag>-k <it/kilobytes/</tag>Set the (approximate) maximum size of
873 present response messages. Default is 1024 Kb (1 Mb).
874 </descrip>
875
876 A <it/listener-address/ consists of a transport mode followed by a
877 colon (:) followed by a listener address. The transport mode is
878 either <tt/osi/ or <tt/tcp/.
879
880 For TCP, an address has the form
881
882 <tscreen><verb>
883 hostname | IP-number &lsqb;: portnumber&rsqb;
884 </verb></tscreen>
885
886 The port number defaults to 210 (standard Z39.50 port).
887
888 For OSI (only available if the server is compiled with XTI/mOSI
889 support enabled), the address form is
890
891 <tscreen><verb>
892 &lsqb;t-selector /&rsqb; hostname | IP-number &lsqb;: portnumber&rsqb;
893 </verb></tscreen>
894
895 The transport selector is given as a string of hex digits (with an even
896 number of digits). The default port number is 102 (RFC1006 port).
897
898 Examples
899
900 <tscreen>
901 <verb>
902 tcp:dranet.dra.com
903
904 osi:0402/dbserver.osiworld.com:3000
905 </verb>
906 </tscreen>
907
908 In both cases, the special hostname &dquot;@&dquot; is mapped to
909 the address INADDR_ANY, which causes the server to listen on any local
910 interface. To start the server listening on the registered ports for
911 Z39.50 and SR over OSI/RFC1006, and to drop root privileges once the
912 ports are bound, execute the server like this (from a root shell):
913
914 <tscreen><verb>
915 zebrasrv -u daemon tcp:@ -s osi:@
916 </verb></tscreen>
917
918 You can replace <tt/daemon/ with another user, eg. your own account, or
919 a dedicated IR server account.
920
921 The default behavior for <tt/zebrasrv/ is to establish a single TCP/IP
922 listener, for the Z39.50 protocol, on port 9999.
923
924 <sect1>Z39.50 Protocol Support and Behavior
925
926 <sect2>Initialization
927
928 <p>
929 During initialization, the server will negotiate to version 3 of the
930 Z39.50 protocol, and the option bits for Search, Present, Scan,
931 NamedResultSets, and concurrentOperations will be set, if requested by
932 the client. The maximum PDU size is negotiated down to a maximum of
933 1Mb by default.
934
935 <sect2>Search
936
937 <p>
938 The supported query type are 1 and 101 All operators except PROXIMITY
939 are currently supported. Queries can be arbitrarily complex. Named
940 result sets are supported, and result sets can be used as operands
941 with no limitations. Searches may span multiple databases.
942
943 The server has full support for piggy-backed present requests (see
944 also the following section).
945
946 <bf/Use/ attributes are interpreted according to the attribute sets which
947 have been loaded in the <tt/zebra.cfg/ file, and are matched against
948 specific fields as specified in the <tt/.abs/ file which describes the
949 profile of the records which have been loaded. If no <bf/Use/
950 attribute is provided, a default of <bf/Any/ is assumed.
951
952 If a <bf/Structure/ attribute of <bf/Phrase/ is used in conjunction with a
953 <bf/Completeness/ attribute of <bf/Complete (Sub)field/, the term is
954 matched against the contents of a phrase (long word) register, if one
955 exists for the given <bf/Use/ attribute. If <bf/Structure/=<bf/Phrase/
956 is used in conjunction with <bf/Incomplete Field/ - the default value
957 for <bf/Completeness/, the search is directed against the normal word
958 registers, but if the term contains multiple words, the term will only
959 match if all of the words are found immediately adjacent, and in the
960 given order. If the <bf/Structure/ attribute is <bf/Word List/,
961 <bf/Free-form Text/, or <bf/Document Text/, the term is treated as a
962 natural-language, relevance-ranked query.
963
964 If the <bf/Relation/ attribute is <bf/Equals/ (default), the term is
965 matched in a normal fashion (modulo truncation and processing of
966 individual words, if required). If <bf/Relation/ is <bf/Less Than/,
967 <bf/Less Than or Equal/, <bf/Greater than/, or <bf/Greater than or
968 Equal/, the term is assumed to be numerical, and a standard regular
969 expression is constructed to match the given expression. If
970 <bf/Relation/ is <bf/Relevance/, the standard natural-language query
971 processor is invoked.
972
973 For the <bf/Truncation/ attribute, <bf/No Truncation/ is the default.
974 <bf/Left Truncation/ is not supported. <bf/Process #/ is supported, as
975 is <bf/Regxp-1/. <bf/Regxp-2/ enables the fault-tolerant (fuzzy)
976 search. As a default, a single error (deletion, insertion,
977 replacement) is accepted when terms are matched against the register
978 contents.
979
980 <sect2>Present
981
982 <p>
983 The present facility is supported in a standard fashion. The requested
984 record syntax is matched against the ones supported by the profile of
985 each record retrieved. If no record syntax is given, SUTRS is the
986 default. The requested element set name, again, is matched against any
987 provided by the relevant record profiles.
988
989 <sect2>Scan
990
991 <p>
992 The attribute combinations provided with the TermListAndStartPoint are
993 processed in the same way as operands in a query (see above).
994 Currently, only the term and the globalOccurrences are returned with
995 the TermInfo structure.
996
997 <sect2>Close
998
999 <p>
1000 If a Close PDU is received, the server will respond with a Close PDU
1001 with reason=FINISHED, no matter which protocol version was negotiated
1002 during initialization. If the protocol version is 3 or more, the
1003 server will generate a Close PDU under certain circumstances,
1004 including a session timeout (60 minutes by default), and certain kinds of
1005 protocol errors. Once a Close PDU has been sent, the protocol
1006 association is considered broken, and the transport connection will be
1007 closed immediately upon receipt of further data, or following a short
1008 timeout.
1009
1010 <sect>The Record Model
1011
1012 <p>
1013 The Zebra system is designed to support a wide range of data management
1014 applications. The system can be configured to handle virtually any
1015 kind of structured data. Each record in the system is associated with
1016 a <it/record schema/ which lends context to the data elements of the
1017 record. Any number of record schema can coexist in the system.
1018 Although it may be wise to use only a single schema within
1019 one database, the system poses no such restrictions.
1020
1021 Records pass through three different states during processing in the
1022 system.
1023
1024 <itemize>
1025 <item>When records are accessed by the system, they are represented
1026 in their local, or native format. This might be SGML or HTML files,
1027 News or Mail archives, MARC records. If the system doesn't already
1028 know how to read the type of data you need to store, you can set up an
1029 input filter by preparing conversion rules based on regular
1030 expressions and a flexible scripting language (Tcl). The input filter
1031 produces as output an internal representation:
1032
1033 <item>When records are processed by the system, they are represented
1034 in a tree-structure, constructed by tagged data elements hanging off a
1035 root node. The tagged elements may contain data or yet more tagged
1036 elements in a recursive structure. The system performs various
1037 actions on this tree structure (indexing, element selection, schema
1038 mapping, etc.),
1039
1040 <item>Before transmitting records to the client, they are first
1041 converted from the internal structure to a form suitable for exchange
1042 over the network - according to the Z39.50 standard.
1043 </itemize>
1044
1045 <sect1>Local Representation<label id="local-representation">
1046
1047 <p>
1048 As mentioned earlier, Zebra places few restrictions on the type of
1049 data that you can index and manage. Generally, whatever the form of
1050 the data, it is parsed by an input filter specific to that format, and
1051 turned into an internal structure that Zebra knows how to handle. This
1052 process takes place whenever the record is accessed - for indexing and
1053 retrieval.
1054
1055 <sect2>Canonical Input Format
1056
1057 <p>
1058 Although input data can take any form, it is sometimes useful to
1059 describe the record processing capabilities of the system in terms of
1060 a single, canonical input format that gives access to the full
1061 spectrum of structure and flexibility in the system. In Zebra, this
1062 canonical format is an &dquot;SGML-like&dquot; syntax.
1063
1064 Consider a record describing an information resource (such a record is
1065 sometimes known as a <it/locator record/). It might contain a field
1066 describing the distributor of the information resource, which might in
1067 turn be partitioned into various fields providing details about the
1068 distributor, like this:
1069
1070 <tscreen><verb>
1071 <Distributor>
1072     <Name> USGS/WRD &etago;Name>
1073     <Organization> USGS/WRD &etago;Organization>
1074     <Street-Address>
1075         U.S. GEOLOGICAL SURVEY, 505 MARQUETTE, NW
1076     &etago;Street-Address>
1077     <City> ALBUQUERQUE &etago;City>
1078     <State> NM &etago;State>
1079     <Zip-Code> 87102 &etago;Zip-Code>
1080     <Country> USA &etago;Country>
1081     <Telephone> (505) 766-5560 &etago;Telephone>
1082 &etago;Distributor>
1083 </verb></tscreen>
1084
1085 <it>NOTE: The indentation used above is used to illustrate how Zebra
1086 interprets the markup. The indentation, in itself, has no
1087 significance to the parser for the canonical input format, which
1088 discards superfluous whitespace.</it>
1089
1090 The keywords surrounded by &lt;...&gt; are <it/tags/, while the
1091 sections of text in between are the <it/data elements/. A data element
1092 is characterized by its location in the tree that is made up by the
1093 nested elements. Each element is terminated by a closing tag -
1094 beginning with &etago;, and containing the same symbolic tag-name as
1095 the corresponding opening tag. The general closing tag - &etago;&gt; -
1096 terminates the element started by the last opening tag. The
1097 structuring of elements is significant. The element <bf/Telephone/,
1098 for instance, may be indexed and presented to the client differently,
1099 depending on whether it appears inside the <bf/Distributor/ element,
1100 or some other, structured data element such a <bf/Supplier/ element.
1101
1102 <sect3>Record Root
1103
1104 <p>
1105 The first tag in a record describes the root node of the tree that
1106 makes up the total record. In the canonical input format, the root tag
1107 should contain the name of the schema that lends context to the
1108 elements of the record (see section <ref id="internal-representation"
1109 name="Internal Representation">). The following is a GILS record that
1110 contains only a single element (strictly speaking, that makes it an
1111 illegal GILS record, since the GILS profile includes several mandatory
1112 elements - Zebra does not validate the contents of a record against
1113 the Z39.50 profile, however - it merely attempts to match up elements
1114 of a local representation with the given schema):
1115
1116 <tscreen><verb>
1117 <gils>
1118     <title>Zen and the Art of Motorcycle Maintenance&etago;title>
1119 &etago;gils>
1120 </verb></tscreen>
1121
1122 <sect3>Variants
1123
1124 <p>
1125 Zebra allows you to provide individual data elements in a number of
1126 <it/variant forms/. Examples of variant forms are textual data
1127 elements which might appear in different languages, and images which
1128 may appear in different formats or layouts. The variant system in
1129 Zebra is
1130 essentially a representation of the variant mechanism of
1131 Z39.50-1995.
1132
1133 The following is an example of a title element which occurs in two
1134 different languages.
1135
1136 <tscreen><verb>
1137 <title>
1138   <var lang lang "eng">
1139     Zen and the Art of Motorcycle Maintenance&etago;>
1140   <var lang lang "dan">
1141     Zen og Kunsten at Vedligeholde en Motorcykel&etago;>
1142 &etago;title>
1143 </verb></tscreen>
1144
1145 The syntax of the <it/variant element/ is <tt>&lt;<bf/var/ <it/class
1146 type value/&gt;</tt>. The available values for the <it/class/ and
1147 <it/type/ fields are given by the variant set that is associated with the
1148 current schema (see section <ref id="variant-set" name="Variant Set
1149 File">).
1150
1151 Variant elements are terminated by the general end-tag &etago;>, by
1152 the variant end-tag &etago;var>, by the appearance of another variant
1153 tag with the same <it/class/ and <it/value/ settings, or by the
1154 appearance of another, normal tag. In other words, the end-tags for
1155 the variants used in the example above could have been saved.
1156
1157 Variant elements can be nested. The element
1158
1159 <tscreen><verb>
1160 <title>
1161   <var lang lang "eng"><var body iana "text/plain">
1162     Zen and the Art of Motorcycle Maintenance
1163 &etago;title>
1164 </verb></tscreen>
1165
1166 Associates two variant components to the variant list for the title
1167 element.
1168
1169 Given the nesting rules described above, we could write
1170
1171 <tscreen><verb>
1172 <title>
1173   <var body iana "text/plain>
1174     <var lang lang "eng">
1175       Zen and the Art of Motorcycle Maintenance
1176     <var lang lang "dan">
1177       Zen og Kunsten at Vedligeholde en Motorcykel
1178 &etago;title>
1179 </verb></tscreen>
1180
1181 The title element above comes in two variants. Both have the IANA body
1182 type &dquot;text/plain&dquot;, but one is in English, and the other in
1183 Danish. The client, using the element selection mechanism of Z39.50,
1184 can retrieve information about the available variant forms of data
1185 elements, or it can select specific variants based on the requirements
1186 of the end-user.
1187
1188 <sect2>Input Filters
1189
1190 <p>
1191 In order to handle general input formats, Zebra allows the
1192 operator to define filters which read individual records in their native format
1193 and produce an internal representation that the system can
1194 work with.
1195
1196 Input filters are ASCII files, generally with the suffix <tt/.flt/.
1197 The system looks for the files in the directories given in the
1198 <bf/profilePath/ setting in the <tt/zebra.cfg/ file.
1199
1200 Generally, an input filter consists of a sequence of rules, where each
1201 rule consists of a sequence of expressions, followed by an action. The
1202 expressions are evaluated against the contents of the input record,
1203 and the actions normally contribute to the generation of an internal
1204 representation of the record.
1205
1206 An expression can be either of the following:
1207
1208 <descrip>
1209 <tag/INIT/The action associated with this expression is evaluated
1210 exactly once in the lifetime of the application, before any records
1211 are read. It can be used in conjunction with an action that
1212 initializes tables or other resources that are used in the processing
1213 of input records.
1214
1215 <tag/BEGIN/Matches the beginning of the record. It can be used to
1216 initialize variables, etc. Typically, the <bf/BEGIN/ rule is also used
1217 to establish the root node of the record.
1218
1219 <tag/END/Matches the end of the record - when all of the contents
1220 of the record has been processed.
1221
1222 <tag>/pattern/</tag>Matches a string of characters from the input
1223 record.
1224
1225 <tag/BODY/This keyword may only be used between two patterns. It
1226 matches everything between (not including) those patterns.
1227
1228 <tag/FINISH/THe expression asssociated with this pattern is evaluated
1229 once, before the application terminates. It can be used to release
1230 system resources - typically ones allocated in the <bf/INIT/ step.
1231
1232 </descrip>
1233
1234 An action is surrounded by curly braces ({...}), and consists of a
1235 sequence of statements. Statements may be separated by newlines or
1236 semicolons (;). Within actions, the strings that matched the
1237 expressions immediately preceding the action can be referred to as
1238 &dollar;0, &dollar;1, &dollar;2, etc.
1239
1240 The available statements are:
1241
1242 <descrip>
1243
1244 <tag>begin <it/type &lsqb;parameter ... &rsqb;/</tag>Begin a new
1245 data element. The type is one of the following:
1246 <descrip>
1247 <tag/record/Begin a new record. The followingparameter should be the
1248 name of the schema that describes the structure of the record, eg.
1249 <tt/gils/ or <tt/wais/ (see below). The <tt/begin record/ call should
1250 precede
1251 any other use of the <bf/begin/ statement.
1252
1253 <tag/element/Begin a new tagged element. The parameter is the
1254 name of the tag. If the tag is not matched anywhere in the tagsets
1255 referenced by the current schema, it is treated as a local string
1256 tag.
1257
1258 <tag/variant/Begin a new node in a variant tree. The parameters are
1259 <it/class type value/.
1260
1261 </descrip>
1262
1263 <tag/data/Create a data element. The concatenated arguments make
1264 up the value of the data element. The option <tt/-text/ signals that
1265 the layout (whitespace) of the data should be retained for
1266 transmission. The option <tt/-element/ <it/tag/ wraps the data up in
1267 the <it/tag/. The use of the <tt/-element/ option is equivalent to
1268 preceding the command with a <bf/begin element/ command, and following
1269 it with the <bf/end/ command.
1270
1271 <tag>end <it/&lsqb;type&rsqb;/</tag>Close a tagged element. If no parameter is given,
1272 the last element on the stack is terminated. The first parameter, if
1273 any, is a type name, similar to the <bf/begin/ statement. For the
1274 <bf/element/ type, a tag name can be provided to terminate a specific tag.
1275
1276 </descrip>
1277
1278 The following input filter reads a Usenet news file, producing a
1279 record in the WAIS schema. Note that the body of a news posting is
1280 separated from the list of headers by a blank line (or rather a
1281 sequence of two newline characters.
1282
1283 <tscreen><verb>
1284 BEGIN                { begin record wais }
1285
1286 /^From:/ BODY /$/    { data -element name $1 }
1287 /^Subject:/ BODY /$/ { data -element title $1 }
1288 /^Date:/ BODY /$/    { data -element lastModified $1 }
1289 /\n\n/ BODY END      {
1290                         begin element bodyOfDisplay
1291                         begin variant body iana "text/plain"
1292                         data -text $1
1293                         end record
1294                      }
1295 </verb></tscreen>
1296
1297 If Zebra is compiled with support for Tcl (Tool Command Language)
1298 enabled, the statements described above are supplemented with a complete
1299 scripting environment, including control structures (conditional
1300 expressions and loop constructs), and powerful string manipulation
1301 mechanisms for modifying the elements of a record. Tcl is a popular
1302 scripting environment, with several tutorials available both online
1303 and in hardcopy.
1304
1305 <it>NOTE: Tcl support is not currently available, but will be
1306 included with one of the next alpha or beta releases.</it>
1307
1308 <it>NOTE: Variant support is not currently available in the input
1309 filter, but will be included with one of the next alpha or beta
1310 releases.</it>
1311
1312 <sect1>Internal Representation<label id="internal-representation">
1313
1314 <p>
1315 When records are manipulated by the system, they're represented in a
1316 tree-structure, with data elements at the leaf nodes, and tags or
1317 variant components at the non-leaf nodes. The root-node identifies the
1318 schema that lends context to the tagging and structuring of the
1319 record. Imagine a simple record, consisting of a 'title' element and
1320 an 'author' element:
1321
1322 <tscreen><verb>
1323         TITLE     "Zen and the Art of Motorcycle Maintenance"
1324 ROOT 
1325         AUTHOR    "Robert Pirsig"
1326 </verb></tscreen>
1327
1328 A slightly more complex record would have the author element consist
1329 of two elements, a surname and a first name:
1330
1331 <tscreen><verb>
1332         TITLE     "Zen and the Art of Motorcycle Maintenance"
1333 ROOT  
1334                   FIRST-NAME "Robert"
1335         AUTHOR
1336                   SURNAME    "Pirsig"
1337 </verb></tscreen>
1338
1339 The root of the record will refer to the record schema that describes
1340 the structuring of this particular record. The schema defines the
1341 element tags (TITLE, FIRST-NAME, etc.) that may occur in the record, as
1342 well as the structuring (SURNAME should appear below AUTHOR, etc.). In
1343 addition, the schema establishes element set names that are used by
1344 the client to request a subset of the elements of a given record. The
1345 schema may also establish rules for converting the record to a
1346 different schema, by stating, for each element, a mapping to a
1347 different tag path.
1348
1349 <sect2>Tagged Elements
1350
1351 <p>
1352 A data element is characterized by its tag, and its position in the
1353 structure of the record. For instance, while the tag &dquot;telephone
1354 number&dquot; may be used different places in a record, we may need to
1355 distinguish between these occurrences, both for searching and
1356 presentation purposes. For instance, while the phone numbers for the
1357 &dquot;customer&dquot; and the &dquot;service provider&dquot; are both
1358 representatives for the same type of resource (a telephone number), it
1359 is essential that they be kept separate. The record schema provides
1360 the structure of the record, and names each data element (defined by
1361 the sequence of tags - the tag path - by which the element can be
1362 reached from the root of the record).
1363
1364 <sect2>Variants
1365
1366 <p>
1367 The children of a tag node may be either more tag nodes, a data node
1368 (possibly accompanied by tag nodes),
1369 or a tree of variant nodes. The children of  variant nodes are either
1370 more variant nodes or a data node (possibly accompanied by more
1371 variant nodes). Each leaf node, which is normally a
1372 data node, corresponds to a <it/variant form/ of the tagged element
1373 identified by the tag which parents the variant tree. The following
1374 title element occurs in two different languages:
1375
1376 <tscreen><verb>
1377       VARIANT LANG=ENG  "War and Peace"
1378 TITLE
1379       VARIANT LANG=DAN  "Krig og Fred"
1380 </verb></tscreen>
1381
1382 Which of the two elements are transmitted to the client by the server
1383 depends on the specifications provided by the client, if any.
1384
1385 In practice, each variant node is associated with a triple of class,
1386 type, value, corresponding to the variant mechanism of Z39.50.
1387
1388 <sect2>Data Elements
1389
1390 <p>
1391 Data nodes have no children (they are always leaf nodes in the record
1392 tree).
1393
1394 <it>NOTE: Documentation needs extension here about types of nodes - numerical,
1395 textual, etc., plus the various types of inclusion notes.</it>
1396
1397 <sect1>Configuring Your Data Model<label id="data-model">
1398
1399 <p>
1400 The following sections describe the configuration files that govern
1401 the internal management of data records. The system searches for the files
1402 in the directories specified by the <bf/profilePath/ setting in the
1403 <tt/zebra.cfg/ file.
1404
1405 <sect2>The Abstract Syntax
1406
1407 <p>
1408 The abstract syntax definition (also known as an Abstract Record
1409 Structure, or ARS) is the focal point of the
1410 record schema description. For a given schema, the ABS file may state any
1411 or all of the following:
1412
1413 <itemize>
1414 <item>The object identifier of the Z39.50 schema associated
1415 with the ARS, so that it can be referred to by the client.
1416
1417 <item>The attribute set (which can possibly be a compound of multiple
1418 sets) which applies in the profile. This is used when indexing and
1419 searching the records belonging to the given profile.
1420
1421 <item>The Tag set (again, this can consist of several different sets).
1422 This is used when reading the records from a file, to recognize the
1423 different tags, and when transmitting the record to the client -
1424 mapping the tags to their numerical representation, if they are
1425 known.
1426
1427 <item>The variant set which is used in the profile. This provides a
1428 vocabulary for specifying the <it/forms/ of data that appear inside
1429 the records.
1430
1431 <item>Element set names, which are a shorthand way for the client to
1432 ask for a subset of the data elements contained in a record. Element
1433 set names, in the retrieval module, are mapped to <it/element
1434 specifications/, which contain information equivalent to the
1435 <it/Espec-1/ syntax of Z39.50.
1436
1437 <item>Map tables, which may specify mappings to <it/other/ database
1438 profiles, if desired.
1439
1440 <item>Possibly, a set of rules describing the mapping of elements to a
1441 MARC representation.
1442
1443 <item>A list of element descriptions (this is the actual ARS of the
1444 schema, in Z39.50 terms), which lists the ways in which the various
1445 tags can be used and organized hierarchically.
1446 </itemize>
1447
1448 Several of the entries above simply refer to other files, which
1449 describe the given objects.
1450
1451 <sect2>The Configuration Files
1452
1453 <p>
1454 This section describes the syntax and use of the various tables which
1455 are used by the retrieval module.
1456
1457 The number of different file types may appear daunting at first, but
1458 each type corresponds fairly clearly to a single aspect of the Z39.50
1459 retrieval facilities. Further, the average database administrator,
1460 who is simply reusing an existing profile for which tables already
1461 exist, shouldn't have to worry too much about the contents of these tables.
1462
1463 Generally, the files are simple ASCII files, which can be maintained
1464 using any text editor. Blank lines, and lines beginning with a (&num;) are
1465 ignored. Any characters on a line followed by a (&num;) are also ignored.
1466 All other
1467 lines contain <it/directives/, which provide some setting or value
1468 to the system. Generally, settings are characterized by a single
1469 keyword, identifying the setting, followed by a number of parameters.
1470 Some settings are repeatable (r), while others may occur only once in a
1471 file. Some settings are optional (o), whicle others again are
1472 mandatory (m).
1473
1474 <sect2>The Abstract Syntax (.abs) Files
1475
1476 <p>
1477 The name of this file type is slightly misleading in Z39.50 terms,
1478 since, apart from the actual abstract syntax of the profile, it also
1479 includes most of the other definitions that go into a database
1480 profile.
1481
1482 When a record in the canonical, SGML-like format is read from a file
1483 or from the database, the first tag of the file should reference the
1484 profile that governs the layout of the record. If the first tag of the
1485 record is, say, <tt>&lt;gils&gt;</tt>, the system will look for the profile
1486 definition in the file <tt/gils.abs/. Profile definitions are cached,
1487 so they only have to be read once during the lifespan of the current
1488 process. 
1489
1490 When writing your own input filters, the <bf/record-begin/ command
1491 introduces the profile, and should always be called first thing when
1492 introducing a new record.
1493
1494 The file may contain the following directives:
1495
1496 <descrip>
1497 <tag>name <it/symbolic-name/</tag> (m) This provides a shorthand name or
1498 description for the profile. Mostly useful for diagnostic purposes.
1499
1500 <tag>reference <it/OID-name/</tag> (m) The reference name of the OID for
1501 the profile. The reference names can be found in the <bf/util/
1502 module of <bf/YAZ/.
1503
1504 <tag>attset <it/filename/</tag> (m) The attribute set that is used for
1505 indexing and searching records belonging to this profile.
1506
1507 <tag>tagset <it/filename/</tag> (o) The tag set (if any) that describe
1508 that fields of the records.
1509
1510 <tag>varset <it/filename/</tag> (o) The variant set used in the profile.
1511
1512 <tag>maptab <it/filename/</tag> (o,r) This points to a
1513 conversion table that might be used if the client asks for the record
1514 in a different schema from the native one.
1515
1516 <tag>marc <it/filename/</tag> (o) Points to a file containing parameters
1517 for representing the record contents in the ISO2709 syntax. Read the
1518 description of the MARC representation facility below.
1519
1520 <tag>esetname <it/name filename/</tag> (o,r) Associates the
1521 given element set name with an element selection file. If an (@) is
1522 given in place of the filename, this corresponds to a null mapping for
1523 the given element set name.
1524
1525 <tag>elm <it/path name attribute/</tag> (o,r) Adds an element
1526 to the abstract record syntax of the schema. The <it/path/ follows the
1527 syntax which is suggested by the Z39.50 document - that is, a sequence
1528 of tags separated by slashes (/). Each tag is given as a
1529 comma-separated pair of tag type and -value surrounded by parenthesis.
1530 The <it/name/ is the name of the element, and the <it/attribute/
1531 specifies what attribute to use when indexing the element. A ! in
1532 place of the attribute name is equivalent to specifying an attribute
1533 name identical to the element name. A - in place of the attribute name
1534 specifies that no indexing is to take place for the given element.
1535 </descrip>
1536
1537 <it>
1538 NOTE: The mechanism for controlling indexing is not adequate for
1539 complex databases, and will probably be moved into a separate
1540 configuration table eventually.
1541 </it>
1542
1543 The following is an excerpt from the abstract syntax file for the GILS
1544 profile.
1545
1546 <tscreen><verb>
1547 name gils
1548 reference GILS-schema
1549 attset gils.att
1550 tagset gils.tag
1551 varset var1.var
1552
1553 maptab gils-usmarc.map
1554
1555 # Element set names
1556
1557 esetname VARIANT gils-variant.est  # for WAIS-compliance
1558 esetname B gils-b.est
1559 esetname G gils-g.est
1560 esetname F @
1561
1562 elm (1,10)              rank                        -
1563 elm (1,12)              url                         -
1564 elm (1,14)              localControlNumber     Local-number
1565 elm (1,16)              dateOfLastModification Date/time-last-modified
1566 elm (2,1)               Title                       !
1567 elm (4,1)               controlIdentifier      Identifier-standard
1568 elm (2,6)               abstract               Abstract
1569 elm (4,51)              purpose                     !
1570 elm (4,52)              originator                  - 
1571 elm (4,53)              accessConstraints           !
1572 elm (4,54)              useConstraints              !
1573 elm (4,70)              availability                -
1574 elm (4,70)/(4,90)       distributor                 -
1575 elm (4,70)/(4,90)/(2,7) distributorName             !
1576 elm (4,70)/(4,90)/(2,10 distributorOrganization     !
1577 elm (4,70)/(4,90)/(4,2) distributorStreetAddress    !
1578 elm (4,70)/(4,90)/(4,3) distributorCity             !
1579 </verb></tscreen>
1580
1581 <sect2>The Attribute Set (.att) Files<label id="attset-files">
1582
1583 <p>
1584 This file type describes the <bf/Use/ elements of an attribute set.
1585 It contains the following directives. 
1586
1587 <descrip>
1588
1589 <tag>name <it/symbolic-name/</tag> (m) This provides a shorthand name or
1590 description for the attribute set. Mostly useful for diagnostic purposes.
1591
1592 <tag>reference <it/OID-name/</tag> (m) The reference name of the OID for
1593 the attribute set. The reference names can be found in the <bf/util/
1594 module of <bf/YAZ/.
1595
1596 <tag>ordinal <it/integer/</tag> (m) This value will be used to represent the
1597 attribute set in the index. Care should be taken that each attribute
1598 set has a unique ordinal value.
1599
1600 <tag>include <it/filename/</tag> (o,r) This directive is used to
1601 include another attribute set as a part of the current one. This is
1602 used when a new attribute set is defined as an extension to another
1603 set. For instance, many new attribute sets are defined as extensions
1604 to the <bf/bib-1/ set. This is an important feature of the retrieval
1605 system of Z39.50, as it ensures the highest possible level of
1606 interoperability, as those access points of your database which are
1607 derived from the external set (say, bib-1) can be used even by clients
1608 who are unaware of the new set.
1609
1610 <tag>att <it/att-value att-name &lsqb;local-value&rsqb;/</tag> (o,r) This
1611 repeatable directive introduces a new attribute to the set. The
1612 attribute value is stored in the index (unless a <it/local-value/ is
1613 given, in which case this is stored). The name is used to refer to the
1614 attribute from the <it/abstract syntax/. </descrip>
1615
1616 This is an excerpt from the GILS attribute set definition. Notice how
1617 the file describing the <it/bib-1/ attribute set is referenced.
1618
1619 <tscreen><verb>
1620 name gils
1621 reference GILS-attset
1622 include bib1.att
1623 ordinal 2
1624
1625 att 2001                distributorName
1626 att 2002                indexTermsControlled
1627 att 2003                purpose
1628 att 2004                accessConstraints
1629 att 2005                useConstraints
1630 </verb></tscreen>
1631
1632 <sect2>The Tag Set (.tag) Files
1633
1634 <p>
1635 This file type defines the tagset of the profile, possibly by
1636 referencing other tag sets (most tag sets, for instance, will include
1637 tagsetG and tagsetM from the Z39.50 specification. The file may
1638 contain the following directives.
1639
1640 <descrip>
1641 <tag>name <it/symbolic-name/</tag> (m) This provides a shorthand name or
1642 description for the tag set. Mostly useful for diagnostic purposes.
1643
1644 <tag>reference <it/OID-name/</tag> (o) The reference name of the OID for
1645 the tag set. The reference names can be found in the <bf/util/
1646 module of <bf/YAZ/. The directive is optional, since not all tag sets
1647 are registered outside of their schema.
1648
1649 <tag>type <it/integer/</tag> (m) The type number of the tag within the schema
1650 profile.
1651
1652 <tag>include <it/filename/</tag> (o,r) This directive is used
1653 to include the definitions of other tag sets into the current one.
1654
1655 <tag>tag <it/number names type/</tag> (o,r) Introduces a new
1656 tag to the set. The <it/number/ is the tag number as used in the protocol
1657 (there is currently no mechanism for specifying string tags at this
1658 point, but this would be quick work to add). The <it/names/ parameter
1659 is a list of names by which the tag should be recognized in the input
1660 file format. The names should be separated by slashes (/). The
1661 <it/type/ is th recommended datatype of the tag. It should be one of
1662 the following:
1663 <itemize>
1664 <item>structured
1665 <item>string
1666 <item>numeric
1667 <item>bool
1668 <item>oid
1669 <item>generalizedtime
1670 <item>intunit
1671 <item>int
1672 <item>octetstring
1673 <item>null
1674 </itemize>
1675 </descrip>
1676
1677 The following is an excerpt from the TagsetG definition file.
1678
1679 <tscreen><verb>
1680 name tagsetg
1681 reference TagsetG
1682 type 2
1683
1684 tag     1       title           string
1685 tag     2       author          string
1686 tag     3       publicationPlace string
1687 tag     4       publicationDate string
1688 tag     5       documentId      string
1689 tag     6       abstract        string
1690 tag     7       name            string
1691 tag     8       date            generalizedtime
1692 tag     9       bodyOfDisplay   string
1693 tag     10      organization    string
1694 </verb></tscreen>
1695
1696 <sect2>The Variant Set (.var) Files<label id="variant-set">
1697
1698 <p>
1699 The variant set file is a straightforward representation of the
1700 variant set definitions associated with the protocol. At present, only
1701 the <it/Variant-1/ set is known.
1702
1703 These are the directives allowed in the file.
1704
1705 <descrip>
1706 <tag>name <it/symbolic-name/</tag> (m) This provides a shorthand name or
1707 description for the variant set. Mostly useful for diagnostic purposes.
1708
1709 <tag>reference <it/OID-name/</tag> (o) The reference name of the OID for
1710 the variant set, if one is required. The reference names can be found
1711 in the <bf/util/ module of <bf/YAZ/.
1712
1713 <tag>class <it/integer class-name/</tag> (m,r) Introduces a new
1714 class to the variant set.
1715
1716 <tag>type <it/integer type-name datatype/</tag> (m,r) Addes a
1717 new type to the current class (the one introduced by the most recent
1718 <bf/class/ directive). The type names belong to the same name space as
1719 the one used in the tag set definition file.
1720 </descrip>
1721
1722 The following is an excerpt from the file describing the variant set
1723 <it/Variant-1/.
1724
1725 <tscreen><verb>
1726 name variant-1
1727 reference Variant-1
1728
1729 class 1 variantId
1730
1731   type  1       variantId               octetstring
1732
1733 class 2 body
1734
1735   type  1       iana                    string
1736   type  2       z39.50                  string
1737   type  3       other                   string
1738 </verb></tscreen>
1739
1740 <sect2>The Element Set (.est) Files
1741
1742 <p>
1743 The element set specification files describe a selection of a subset
1744 of the elements of a database record. The element selection mechanism
1745 is equivalent to the one supplied by the <it/Espec-1/ syntax of the
1746 Z39.50 specification. In fact, the internal representation of an
1747 element set specification is identical to the <it/Espec-1/ structure,
1748 and we'll refer you to the description of that structure for most of
1749 the detailed semantics of the directives below.
1750
1751 <it>
1752 NOTE: Not all of the Espec-1 functionality has been implemented yet.
1753 The fields that are mentioned below all work as expected, unless
1754 otherwise is noted.
1755 </it>
1756
1757 The directives available in the element set file are as follows:
1758
1759 <descrip>
1760 <tag>defaultVariantSetId <it/OID-name/</tag> (o) If variants are used in
1761 the following, this should provide the name of the variantset used
1762 (it's not currently possible to specify a different set in the
1763 individual variant request). In almost all cases (certainly all
1764 profiles known to us), the name <tt/Variant-1/ should be given here.
1765
1766 <tag>defaultVariantRequest <it/variant-request/</tag> (o) This directive
1767 provides a default variant request for
1768 use when the individual element requests (see below) do not contain a
1769 variant request. Variant requests consist of a blank-separated list of
1770 variant components. A variant compont is a comma-separated,
1771 parenthesized triple of variant class, type, and value (the two former
1772 values being represented as integers). The value can currently only be
1773 entered as a string (this will change to depend on the definition of
1774 the variant in question). The special value (@) is interpreted as a
1775 null value, however.
1776
1777 <tag>simpleElement <it/path &lsqb;'variant' variant-request&rsqb;/</tag>
1778 (o,r) This corresponds to a simple element request in <it/Espec-1/. The
1779 path consists of a sequence of tag-selectors, where each of these can
1780 consist of either:
1781
1782 <itemize>
1783 <item>A simple tag, consisting of a comma-separated type-value pair in
1784 parenthesis, possibly followed by a colon (:) followed by an
1785 occurrences-specification (see below). The tag-value can be a number
1786 or a string. If the first character is an apostrophe ('), this forces
1787 the value to be interpreted as a string, even if it appears to be numerical.
1788
1789 <item>A WildThing, represented as a question mark (?), possibly
1790 followed by a colon (:) followed by an occurrences specification (see
1791 below).
1792
1793 <item>A WildPath, represented as an asterisk (*). Note that the last
1794 element of the path should not be a wildPath (wildpaths don't work in
1795 this version).
1796 </itemize>
1797
1798 The occurrences-specification can be either the string <tt/all/, the
1799 string <tt/last/, or an explicit value-range. The value-range is
1800 represented as an integer (the starting point), possibly followed by a
1801 plus (+) and a second integer (the number of elements, default being
1802 one).
1803
1804 The variant-request has the same syntax as the defaultVariantRequest
1805 above. Note that it may sometimes be useful to give an empty variant
1806 request, simply to disable the default for a specific set of fields
1807 (we aren't certain if this is proper <it/Espec-1/, but it works in
1808 this implementation).
1809 </descrip>
1810
1811 The following is an example of an element specification belonging to
1812 the GILS profile.
1813
1814 <tscreen><verb>
1815 simpleelement (1,10)
1816 simpleelement (1,12)
1817 simpleelement (2,1)
1818 simpleelement (1,14)
1819 simpleelement (4,1)
1820 simpleelement (4,52)
1821 </verb></tscreen>
1822
1823 <sect2>The Schema Mapping (.map) Files<label id="schema-mapping">
1824
1825 <p>
1826 Sometimes, the client might want to receive a database record in
1827 a schema that differs from the native schema of the record. For
1828 instance, a client might only know how to process WAIS records, while
1829 the database record is represented in a more specific schema, such as
1830 GILS. In this module, a mapping of data to one of the MARC formats is
1831 also thought of as a schema mapping (mapping the elements of the
1832 record into fields consistent with the given MARC specification, prior
1833 to actually converting the data to the ISO2709). This use of the
1834 object identifier for USMARC as a schema identifier represents an
1835 overloading of the OID which might not be entirely proper. However,
1836 it represents the dual role of schema and record syntax which
1837 is assumed by the MARC family in Z39.50.
1838
1839 <it>
1840 NOTE: The schema-mapping functions are so far limited to a
1841 straightforward mapping of elements. This should be extended with
1842 mechanisms for conversions of the element contents, and conditional
1843 mappings of elements based on the record contents.
1844 </it>
1845
1846 These are the directives of the schema mapping file format:
1847
1848 <descrip>
1849 <tag>targetName <it/name/</tag> (m) A symbolic name for the target schema
1850 of the table. Useful mostly for diagnostic purposes.
1851
1852 <tag>targetRef <it/OID-name/</tag> (m) An OID name for the target schema.
1853 This is used, for instance, by a server receiving a request to present
1854 a record in a different schema from the native one. The name, again,
1855 is found in the <bf/oid/ module of <bf/YAZ/.
1856
1857 <tag>map <it/element-name target-path/</tag> (o,r) Adds
1858 an element mapping rule to the table.
1859 </descrip>
1860
1861 <sect2>The MARC (ISO2709) Representation (.mar) Files
1862
1863 <p>
1864 This file provides rules for representing a record in the ISO2709
1865 format. The rules pertain mostly to the values of the constant-length
1866 header of the record.
1867
1868 <it>NOTE: This will be described better. We're in the process of
1869 re-evaluating and most likely changing the way that MARC records are
1870 handled by the system.</it>
1871
1872 <sect1>Exchange Formats
1873
1874 <p>
1875 Converting records from the internal structure to en exchange format
1876 is largely an automatic process. Currently, the following exchange
1877 formats are supported:
1878
1879 <itemize>
1880 <item>GRS-1. The internal representation is based on GRS-1, so the
1881 conversion here is straightforward. The system will create
1882 applied variant and supported variant lists as required, if a record
1883 contains variant information.
1884
1885 <item>SUTRS. Again, the mapping is fairly straighforward. Indentation
1886 is used to show the hierarchical structure of the record.
1887
1888 <item>ISO2709-based formats (USMARC, etc.). Only records with a
1889 two-level structure (corresponding to fields and subfields) can be
1890 directly mapped to ISO2709. For records with a different structuring
1891 (eg., GILS), the representation in a structure like USMARC involves a
1892 schema-mapping (see section <ref id="schema-mapping" name="Schema
1893 Mapping">), to an &dquot;implied&dquot; USMARC schema (implied,
1894 because there is no formal schema which specifies the use of the
1895 USMARC fields outside of ISO2709). The resultant, two-level record is
1896 then mapped directly from the internal representation to ISO2709. See
1897 the GILS schema definition files for a detailed example of this
1898 approach.
1899
1900 <item>Explain. This representation is only available for records
1901 belonging to the Explain schema.
1902
1903 </itemize>
1904
1905 <sect>License
1906
1907 <p>
1908 Copyright &copy; 1995, Index Data.
1909
1910 All rights reserved.
1911
1912 Use and redistribution in source or binary form, with or without
1913 modification, of any or all of this software and documentation is
1914 permitted, provided that the following conditions are met:
1915
1916 1. This copyright and permission notice appear with all copies of the
1917 software and its documentation. Notices of copyright or attribution
1918 which appear at the beginning of any file must remain unchanged.
1919
1920 2. The names of Index Data or the individual authors may not be used to
1921 endorse or promote products derived from this software without specific
1922 prior written permission.
1923
1924 3. Source code or binary versions of this software and its
1925 documentation may be used freely in not-for-profit applications. For
1926 profit applications - such as providing for-pay database services,
1927 marketing a product based in whole or in part on this software or its
1928 documentation, or generally distributing this software or its
1929 documentation under a different license - requires a commercial
1930 license from Index Data. The software may be installed and used for
1931 evaluation purposes in conjunction with a commercial application for a
1932 trial period of no more than 60 days.
1933
1934 THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
1935 EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
1936 WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1937 IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
1938 INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
1939 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
1940 NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
1941 LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
1942 OF THIS SOFTWARE.
1943
1944 <sect>About Index Data and the Zebra Server
1945
1946 <p>
1947 Index Data is a consulting and software-development enterprise that
1948 specialises in library and information management systems. Our
1949 interests and expertise span a broad range of related fields, and one
1950 of our primary, long-term objectives is the development of a powerful
1951 information management
1952 system with open network interfaces and hypermedia capabilities.
1953
1954 We make this software available free of charge for not-for-profit
1955 purposes, as a service to the networking community, and to further
1956 the development and use of quality software for open network
1957 communication.
1958
1959 If you like this software, and would like to use all or part of it in
1960 a commercial product, or to provide a commercial database service,
1961 please contact us to discuss the details. We'll be happy to answer
1962 questions about the software, and about our services in general. If
1963 you have specific requirements to the software, we'll be glad to offer
1964 our advice - and if you need to adapt the software to a special
1965 purpose, our consulting services and expert knowledge of the software
1966 is available to you at favorable rates.
1967
1968 <tscreen>
1969 Index Data&nl
1970 Ryesgade 3&nl
1971 DK-2200 K&oslash;benhavn N&nl
1972 </tscreen>
1973
1974 <p>
1975 <tscreen><verb>
1976 Phone: +45 3536 3672
1977 Fax  : +45 3536 0449
1978 Email: info@index.ping.dk
1979 </verb></tscreen>
1980
1981 The <it>Random House College Dictionary</it>, 1975 edition
1982 offers this definition of the 
1983 word &dquot;Zebra&dquot;:
1984
1985 <it>
1986 Zebra, n., any of several horselike, African mammals of the genus Equus,
1987 having a characteristic pattern of black or dark-brown stripes on
1988 a whitish background.
1989 </it>
1990
1991 </article>