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