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