FREEWAIS-SF et Sfgate : Installation, indexation, interrogation.

Elizabeth CHERHAL , Cellule MathDoc

Support du cours donné à Médiadix les 27 et 28 Février 1997.

Très lègrement modifié en novembre 2000.


FREEWAIS-SF et Sfgate : Installation, indexation, interrogation.

Que font WAIS et Sfgate ?

WAIS (Wide Area Information Servers) a été développé à l'origine par Thinking Machines Corporation. C'est un outil d'indexation et de recherche d'information client/serveur sur le réseau. WAIS utilise le protocole Z39.50.

Le développement de WAIS a été repris à la fois par le CNIDR et par la société America Online (qui a absorbé la compagnie " Wais Inc "). Le CNIDR a développé une version freeware de WAIS (FreeWAIS).

L'équipe de RI de l'Université de Dortmund a également repris le développement de freewais, pour y inclure des possibilités de recherche par "champs", d'où le nom FreeWais-sf (structured fields). Cette possibilité permet la création d'indexes (fichiers inverses) concernant une partie des documents et non leur totalité, comme c'était le cas avec freewais. La possibilité d'indexer des "champs" implique la possibilité d'indexer n'importe quel document structuré. (sgml, html).

Freewais-sf est aujourd'hui la seule version de wais encore développée.

SFgate est une interface web pour interroger les bases wais. Sfgate est un programme écrit en perl, qui s'installe dans le répertoire cgi-bin d'un serveur web.

Où trouver Freewais-sf et Sfgate?

En consultant la page http://www-mathdoc.ujf-grenoble.fr/bibs/wais.html on obtient les informations à jour. Des informations pour l'installation peuvent être trouvées à la page http://www-mathdoc.ujf-grenoble.fr/download/wais

Compilation et Installation de Freewais-sf et Sfgate: les étapes

Il faut:

Des versions précompilées de freewais-sf existent pour certaines plateformes, mais si on désire installer aussi Sfgate, on aura besoin de compiler soi même freewais-sf, pour pouvoir disposer de ses librairies, voire de ses sources afin de générer un module perl indispensable au fonctionnement de Sfgate.

Les étapes sont donc:

Compilation de freewais-sf

Récupérez et imprimez le fichier fwsf.ps qui contient toutes les instructions pour la compilation et l'installation. Ce document est assez clair.

Il faut exécuter le script " configure " qui est livré avec la distribution. Ce script détermine quelques propriétés du système d 'exploitation, puis pose des questions. Généralement la réponse aux questions est assez évidente, et il est conseillé d'utiliser les valeurs par défaut proposées par le script.

Si vous tenez dans votre application à utiliser l'opérateur de proximité " near ", il faut répondre " y " à la question " use proximity instead of search string ". Malheureusement, cette option élimine la possibilité de faire une recherche par chaîne de caractères (les deux options sont incompatibles). L'option par défaut est d'utiliser la possibilité de recherche par chaîne.

Un point important est la bonne utilisation des caractères accentués iso-latins. Une des questions du script " configure " concerne le " character set ". Il est prudent de compiler freewais-sf avec son propre package " ctype ". C'est la valeur par défaut. Si vous utilisez cette valeur par défaut, on vous demandera ensuite les caractères accentués en majuscules et minuscules à prendre en compte. S'assurer qu'on est capable de saisir au clavier les caractères iso-latins accentués de façon correcte. (cette remarque concerne les inconditionnels de claviers qwerty) :-)

Une fois compilé, le serveur wais se compose de deux parties: le "démon" waisserver, et l'indexeur waisindex. Il y a également un certain nombre de clients: (xwais, swais, waisq et waissearch.) Les commandes waisindex et les clients wais doivent être installés dans un répertoire figurant dans le "path" standard de la machine (/usr/local/bin par exemple).

L'installation d'un serveur consiste premièrement à indexer les fichiers. deuxièmement à lancer le démon waisserver. Il ne faut pas lancer le démon avant d'avoir indexé quelque chose. (voir plus loin).

Compilation du module wais.pm

Wais.pm est un module perl nécessaire à Sfgate. Sa compilation nécessite d'avoir un compilateur gcc d'une part, et une version récente de perl d'autre part. Vous trouverez le module wais dans les archives normales de perl,

(http://www.perl.com/CPAN/) et aussi sur le serveur mathdoc :

(ftp://mathdoc.ujf-grenoble.fr/pub/mathdoc/SFgate/waisperl)

Votre version de perl doit permettre l'édition de liens dynamiques (vérifiez que lors de son installation il a été compilé avec l'option -dusedl).

Le module wais vient avec un programme perl qui construit le makefile. (Makefile.PL)

Il faut définir la variable $FW pour qu'il pointe sur l'endroit ou vous avez installé la hiérarchie freewais-sf (/usr/local/src/freeWAIS-sf-2.1.2 par exemple), ensuite on devrait pouvoir faire " perl Makefile.PL", puis " make ", et éventuellement " make install ".

On peut théoriquement compiler wais.pm en utilisant non pas les sources, mais seulement les librairies. Il faut suivre très attentivement les instructions du fichier readme accompagnant la version courante. Il est plus facile d'utiliser la hiérarchie freewais-sf dans son ensemble.

Installation de Sfgate

A côté de ce qui précède, l'installation de Sfgate est un jeu d'enfant :-)

Rappelons que Sfgate est un programme perl qui s'installe dans le répertoire cgi-bin de votre serveur web (httpd) (la documentation parle des serveurs CERN et NCSA, il marche aussi avec le serveur netsite, et on doit aussi pouvoir l'utiliser avec le serveur apache). Vous devez donc avoir un serveur httpd en état de marche.

Récupérez, avant de commencer, le fichier SFgate.ps, qui contient les instructions détaillés pour l'installation. Ce document est très complet, et en le lisant attentivement, on s'en sort sans problèmes. Voici cependant quelques tuyaux:

Indexation de fichiers par waisindex

Créez, quelque part dans la hiérarchie de votre machine, un répertoire devant contenir vos bases (/usr/local/waisbases par exemple).

Décidez du nom de la base que vous voulez créer. Ne choisissez pas un nom trop ésotérique. Il est bien que d'après le nom on comprenne à peu près de quoi il s'agit, surtout si vous avez l'intention d'indexer plusieurs bases différentes.

Vous pouvez bien sur utiliser freewais-sf pour indexer des fichiers sans les possibilités d'utiliser des champs. Il existe de multiples possibilités.

En tapant la commande "waisindex" sans argument, vous obtiendrez la liste suivante:

Usage: ./waisindex [-d index_filename]
[-a] /* adding to an existing index, otherwise it erases the index */
[-stem] /* stemming for global database */
[-r] /* recursively index subdirectories */
[-mem mbytes] /* number of megabytes to run this in */
[-register] /* registers the database with the directory of servers.
This should be done with care. */
[-export] /* uses short dbname and port 210 */
[-e [file]] /* set log output to file, or /dev/null if not specified */
[-l log_level] /* set log level. 0 means log nothing,
10 [the default] means log everything */
[-v] /* print the version of the software */
[-stdin] /* read file names from stdin */
[-pos | -nopos] /* include (don't include - default) word position information /*
[-nopairs | -pairs] /* don't include (or include - default is nopairs) word pairs /*
[-nocat] /* inhibit creation of catalog /*
[-contents] /* Index the contents: this is good for types that
inhibit the indexing of the contents (like gif). /*
[-nocontents] /* Index only the filename, not the contents /*
[-stop stoplist_filename] /* file of common words to ignore */
[-keywords "<string>"] /* Keywords to index for each document. */
[-keyword_file <filename>] /* File of keywords to index. */
[-cmmem mem] /* percent of CM memory (CM code only) */
[-T type] /* type becomes the "TYPE" of the document. */
[-M type,type] /* for multi-type documents. */
[-t /* format of the file. if none then each file is a document */
text /* simple text files, this is the default */
| bibtex /* BibTeX / LaTeX format */
| bio /* biology abstract format */
| cmapp /* CM applications from Hypercard */
| dash /* entries separated by a row of dashes */
| dvi /* dvi format */
| emacsinfo /* the GNU documentation system */
| essence /* CU-Boulder Essence Summaries */
| first_line /* first line of file is headline */
| filename /* uses only the filename part of the pathname for the title */
| ftp /* special type for FTP files. First line of file is headline */
| gif /* gif files, only indexes the filename */
| irg /* internet resource guide */
| jargon /* Jargon File 2.9.8 format*/
| mail_digest /* standard internet mail digest format */
| mh_bboard /* MH bulletin board format */
| netnews /* netnews format */
| nhyp /* ?:? hyper text format, Polytechnic of Central London */
| one_line /* each line is a document */
| para /* paragraphs separated by blank lines */
| pict /* pict files, only indexes the filename */
| ps /* postscript format */
| refer /* refer format */
| irlist /* irlist mail or rmail or both */
| formfeed /* entries separated by a formfeed */
| bibdb /* steve file entries separated by a formfeed */
| bibinf /* bibinf entries separated by an empty line */
| rn /* netnews saved by the [rt]?rn newsreader */
| server /* server structures for the dir of servers */
| tiff /* tiff files, only indexes the filename */
| URL what-to-trim what-to-add /* URL */
| oneline_phonix /* Phonebooks PHONIX */
| oneline_soundex /* Phonebooks SOUNDEX */
| listserv_digest /* standard internet mail digest format */
| fields /* document format given in <database>.fmt */
] filename filename ...
-nfields /* create new fields, old fields not deleted, by default all fields will be deleted*/

Indexation d'un fichier contenant des champs documentaires

Définition des types de Champs et d'Index

On spécifie les champs entre region et end selon la règle suivante

region: start skip

field options indexspecs

end: end

start: l'expression régulière décrivant le début de champ

skip: expression régulière décrivant une chaîne à ignorer

field: nom du champ qu'on va indexer

options: numeric, date, stemming

indexspecs: types (text, soundex, phonix) et catégories (local, global, both)

end: l'expression régulière décrivant la fin de champ

Pour indexer un fichier avec champs, celui ci doit être structuré de manière à pouvoir reconnaître facilement les différents champs. Ce fichier aura probablement été exporté d'un logiciel documentaire, tel que texto, superdoc, bibliotek, etc...

Voici un exemple d'un tel fichier, (le fichier irepd.doc.txt)

...
TIT: LA NEGOCIATION COLLECTIVE EN 1993
STI: TOME 2 = CHIFFRES ET DOCUMENTS
AMO: MINISTERE DU TRAVAIL, DE L'EMPLOI ET DE LA FORMATION PROFESSIONNELLE
NPG: 241P.
LPU: PARIS
EDI: LA DOCUMENTATION FRANCAISE
DAT: 1994
RUB: NEGOCIATION COLLECTIVE,DONNEES STATISTIQUES,BRANCHE PROFESSIONNELLE,
CONVENTION COLLECTIVE
RES: Cet ouvrage offre une vision globale de l'évolution des accords signés
par les branches professionnelles, en reprenant notamment les textes signés en
matière de salaires, de durée du travail et de formation professionnelle. Il
dresse aussi un bilan de l'opération de revalorisation des bas et moyens
salaires, de rénovation des classifications et d'ouverture de perspectives de
carrière au profit des salariés .
LOC: I.R.E.P.D.

Le fichier <nom de base>.fmt et les expressions régulières

On doit ensuite décrire la structure des champs dans un fichier appelé <nom de base>.fmt. La structure se décrit à l'aide d'expressions régulières. Si vous n'êtes pas un gourou unix, vous aurez peut-être un peu de mal avec les expressions régulières. Voici le principe:

x le caractère x

"x" un "x" même si "x" est un opérateur

\x un "x" même si "x" est un caractère spécial

[xy] x ou y

[x-z] n'importe quel caractère entre x et z (en l'occurrence x, y ou z)

[^x] n'importe quel caractère sauf x

. n'importe quel caractère sauf "newline"

* toutes les occurences du caractère précédent

^x x en début de ligne

x|y x ou y

x{m,n} de m à n occurrences de x

...

Soit pour le fichier de notices bibliographiques ci dessus, le fichier irepd.doc.fmt suivant.

record-sep: /^\\n$/ 1

layout:
headline /^TIT: / /^[A-Z][A-Z][A-Z]: / 80 /TIT: /
end: 2

region: /^TIT: / 3
TEXT GLOBAL
end: /^LOC: /

region: /^TIT: / 4
tit TEXT LOCAL
end: /^[A-Z][A-Z][A-Z]:/

region: /^STI: /
sti TEXT LOCAL
end: /^[A-Z][A-Z][A-Z]:/

region: /^AUT: / 5
aut TEXT LOCAL
end: /^[A-Z][A-Z][A-Z]:/

region: /^AMO: /
amo TEXT LOCAL
end: /^[A-Z][A-Z][A-Z]:/

region: /^RUB: / 6
mcl TEXT LOCAL
end: /^[A-Z][A-Z][A-Z]:/

Explications:

1 ) On définit le séparateur de documents: ici l'expression ^\\n$ signifie "ligne vide" (ligne commençant par linefeed (\n) et ne contenant que "fin de ligne" ($))

2 ) On définit la headline (ligne d'en-tête). La headline est ce qu'on voit en

réponse à une question. Dans cet exemple elle sera constituée des 80 caractères suivant la chaîne "TIT:" en début de ligne, et elle se termine par la prochaine occurrence en début de ligne (^) de 3 lettres majuscules suivie de deux points (:) ( [A-Z] = n'importe quel caractère de A majuscule à Z majuscule)

3 ) On définit un index global. A l'interrogation, on n'aura pas besoin de nommer cet index pour l'interroger. Dans cet exemple, cet index contiendra tous les mots de tous les documents. Le "champ" indexé commence par "TIT:" en début de ligne et se termine par "LOC:" en début de ligne. (toutes les notices de cette base se terminent par le champ "LOC"). On aurait pu faire terminer le champ par le séparateur de documents "^\n$".

4 ) On définit un index local contenant le champ "tit". Pour interroger ce champ on devra poser une question du genre "tit=carburant*". Le champ "tit" commence par les caractères "TIT:" en début de ligne et se termine par la prochaine occurrence de trois caractères majuscules suivie de deux points en début de ligne.

5 ) On procède de la même manière pour les champs STI, AUT, AMO, RUB.

6) Pour le champ commençant par la chaîne de caractères RUB, on va dire à waisindex de créer un champ appellé " mcl ". Cet exemple montre que, quel que soit le nom réel des champs exportés de la base d'origine, on peut les changer au moment de l'indexation de la base wais.

Une fois créé le fichier .fmt, il suffit d'exécuter la commande waisindex avec l'argument -t fields. Voici un exemple:

waisindex -d irepd.doc -t fields -export -l 10 irepd.doc.txt

L'exécution de waisindex créera un certain nombre de fichiers. (.cat, .inv, .dlm etc...) Ce sont tous ces fichiers qui constituent la "base wais".

Pour que le serveur wais trouve la base, tous ces fichiers doivent résider dans le directory qu'on a décidé "d'exporter", dans la commande waisserver. (/usr/local/waisbases par exemple)

Si vous ne voulez pas avoir physiquement tous ces fichiers dans le même directory, vous pouvez créer des liens symboliques.

Indexation dune collection de fichiers html

Freewais-sf est particulièrement adapté à l'indexation de fichiers html (hypertextes se trouvant dans les serveurs www).

En combinant les arguments -T HTML et -t fields de waisindex, on peut créer des "bases hypertextes".

On peut, par exemple:

- indexer un méga-fichier html , ou un ensemble de fichiers dans différents répertoires

- n'indexer qu'une partie du texte

- choisir la headline

Voici un exemple (réel) de fichiers contenant des balises <META>, particulièrement utiles pour l'indexation, mais dont on indexe également le corps du fichier html:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
<!--Converted with LaTeX2HTML 96.1-h (September 30, 1996) by Nikos Drakos (nikos@cbl.leeds.ac.uk), CBLU, University of Leeds -->
<HTML>
<HEAD>
<TITLE>Sur l'harmonicité des fonctions séparément harmoniques</TITLE>
<LINK REL=STYLESHEET HREF="NoticeSP/101/101.css">
<BASE HREF="http://www-mathdoc.ujf-grenoble.fr/SemProba/">
<META NAME="author" CONTENT="AVANISSIAN Vazgain">
<META NAME="title" CONTENT="Sur l'harmonicité des fonctions séparément harmoniques">
<META NAME="keywords" CONTENT="Doubly harmonic functions">
<META NAME="abstract" CONTENT="http://www-mathdoc.ujf-grenoble.fr/SemProba/101/m101.html">
</HEAD>
<BODY LANG="EN" BGCOLOR="#ffffe8" LINK="#05036" TEXT="#d50306" VLINK="#0748b4">
<A HREF="/"><img src="/images/LMD.petit.gif" align=left hspace=10></A>
<br><H1>Séminaire de Probabiblités
<br>Probability Seminar </H1>
<B>AVANISSIAN Vazgain</B>
<P>
<EM>Sur l'harmonicité des fonctions séparément harmoniques.</EM>
<P>
101 (1967) 3-17
<P>
<DES>
This paper proves a harmonic version of Hartogs' theorem : separately harmonic functions are jointly harmonic (without any boundedness assumption) using a complex extension procedure. The talk is an extract from the author's original work in <I>Ann. ENS,</I> <B>178</B>, 1961
</DES>
<P>
[This talk was justified by the current interest of the seminar in doubly excessive functions, see next paper Cairoli <A NAME="tex2html1" HREF="NoticeSP/102/m102.html">#102</A>]
<P>
<EM>Mot_clé</EM> : Doubly harmonic functions
<P>
<EM>Classification</EM> : Potential theory
<P>
<EM>Type</EM> : Exposition
<P>
<a href=".">Retour</a> à la page de garde
<P>
<P>
<BR> <HR>
<P><ADDRESS>

</ADDRESS>
</BODY>
</HTML>

Voici le fichier .fmt permettant l'indexation de ces fichiers:

record-sep: /^<\/HTML>/

layout
headline: /^<META NAME="author" CONTENT="/ /">/ 30 /^<META NAME="author" CONTENT="/
headline: /^<META NAME="title" CONTENT="/ /">/ 100 /^<META NAME="title" CONTENT="/
end:

region: /^<HTML>/
TEXT GLOBAL
end: /^<\/HTML>/


region: /^<META NAME="author" CONTENT="/ /^<META NAME="author" CONTENT="/
aut TEXT LOCAL
end: /">/

region: /^<META NAME="title" CONTENT="/ /^<META NAME="title" CONTENT="/
tit TEXT LOCAL
end: /">/

region: /^<META NAME="keywords" CONTENT="/ /^<META NAME="keywords" CONTENT="/
kwd TEXT LOCAL
end: /">/

region: /^[0-9][0-9][0-9] / /^[0-9][0-9][0-9] */
dat TEXT LOCAL
end: /[0-9][0-9]$/

region: /^<DES>/ /^<DES> */
des TEXT LOCAL
end: /^<\/DES>/

region: /^\\[/
com TEXT LOCAL
end: /\\]/

region: /^<EM>Classification<\/EM> : / /^<EM>Classification<\/EM> : */
cla TEXT LOCAL
end: /^<P>/

Ces fichiers html se trouvant dans toute une hiérarchie de répertoires, on peut lancer la commande waisindex comme suit: (l'argument -r permet de descendre une hiérarchie de répertoires).

waisindex -d <base> -T HTML -t fields -export -l 10 -r <nom de répertoire>/*/*.html

Le démon waisserver

Si vous voulez indexer des fichiers, puis permettre l'accès à vos fichiers via le web, vous n'avez pas besoin de lancer un démon waisserver. SFgate, s'il est installé sur la même machine que vos bases wais peut leur accéder en local.

Mais, si vous désirez que d'autres gens puissent accéder à vos bases sans obligatoirement passer par votre serveur web, vous devez les rendre accessibles par le démon waisserver. (Cas d'une interrogation multibases réparties, par exemple).

Lancement du démon waisserver

Copiez (ou créez un lien symbolique) l'exécutable waisserver dans le directory où résident les autres démons de votre machine (/usr/local/etc par exemple).

Décidez sur quel port logique vous allez faire tourner le démon. Le défaut est le port 210, mais pour tester vous pouvez lancer waisserver sur un autre port.

(il est même conseillé de le faire, tant que tout ne marche pas comme vous le désirez).

Quand tout fonctionne, vous pouvez lancer le démon waisserver en "standalone" ou par inetd.

--> en Standalone: (le démon waisserver tournera tout le temps tant que vous ne l'arrêtez pas.)

/usr/local/etc/waisserver -p 210 -d /usr/local/waisbases

(si vous décidez de toujours lancer le démon de cette façon, il faudra inclure cette commande dans le fichier de démarrage de votre machine, rc.local ou ...)

--> par inted: ( le démon waisserver ne tournera que lorsqu'il est sollicité par une requête d'un client . Dans le fichier /etc/services mettez la ligne suivante:

wais tcp 210 (ou le numéro de port que vous avez choisi)

Dans le fichier inetd.conf mettez la ligne suivante:

wais stream tcp nowait root /usr/local/etc/waisserver waisserver.d -d /usr/local/waisbases -e /usr/local/waisbases/logs/log

........

Puis relancez inetd (kill -HUP <le numero de process d'inetd>)

Vous pouvez maintenant tester votre base à l'aide d'un client wais quelconque. Le plus simple est d'utiliser waissearch. Par exemple:

waissearch -h <votre machine> -p 210 -d <votre base> "question"

Si vous obtenez des réponses, vous avez gagné!

La base INFO

Le démon waisserver créera et maintiendra automatiquement une base "INFO" dans votre répertoire "exporté". C'est cette base que les clients peuvent interroger afin de récupérer les différents fichiers .src de votre machine. Vous ne devez ni modifier ni détruire la base INFO.

Utilisation de Sfgate

Bien qu'on puisse l'appeler par URL, SFgate s'appelle normalement à travers un formulaire html. Pour débuter, il est facile de copier quelque part sur le réseau le formulaire de quelqu'un d'autre, le modifier, et regarder ce que cela donne. Il y a aussi un formulaire de démo livré avec la distribution, qui passe en revue la quasi totalité des options possibles.

Le formulaire de base

Sfgate peut être appelé avec la méthode GET ou POST. Il est conseillé d'utiliser la méthode POST pour ne pas avoir d'ennuis avec la longueur de la chaîne des arguments qu'on lui passe.

Voici un formulaire assez simple:

<HTML>
<HEAD>
<TITLE>Interrogation de la base Unetelle </TITLE>
</HEAD>
<BODY>
<H2>Interrogation de la base Unetelle</H2>
<br>
<hr>


<form METHOD=POST ACTION="http://www-mathdoc.ujf-grenoble.fr/cgi-bin/SFgate">


<p>
<input NAME="database"
TYPE="hidden"
VALUE="malherbe.ujf-grenoble.fr/unetelle">

<input type="submit" value="Lancer"> la recherche ..... ou .....
<INPUT TYPE=reset VALUE="Effacer la saisie">

<TABLE BORDER CELLPADDING="2">
<TR>
<TD>Auteur</A>
</TD>
<TD><INPUT TYPE=TEXT name="aut" SIZE="30">
</TD>
</TR>
<TR>
<TD> Mots du Titre
</TD>
<TD><INPUT TYPE=TEXT name="tit" SIZE="30">
</TD>
</TR>
<TR>
<TD>Classification</A>
</TD>
<TD><INPUT TYPE=TEXT name="cla" SIZE="30">
</TD>
</TR>
<TR>
<TD>Date
</TD>
<TD><INPUT TYPE=TEXT name="dat" SIZE="30">
</TD>
</TR>
<TR>
<TD> Mots Clés</A>
</TD>
<TD><INPUT TYPE=TEXT name="kwd" SIZE="30">
</TD>
</TR>
<TR>
<TD>Mots du Résumé
</TD>
<TD><INPUT TYPE=TEXT name="des" size="30">
</TD>
</TR>
<TR>
<TD>Commentaires
</TD>
<TD><INPUT TYPE=TEXT name="com" size="30">
</TD>
</TR>
<TH>
<i>ou</i>
<TR>
<TD>Interrogation de l'index global
</TD>
<TD><INPUT TYPE=TEXT name="text" SIZE="30"></b>
</TD>
</TR>
</TABLE>
<p>
<input type="submit" value="Lancer"> la recherche ..... ou .....
<INPUT TYPE=reset VALUE="Effacer la saisie">
<p>
Nombre maximum de r&eacute;ponses? <input NAME="maxhits" TYPE=TEXT value="1000" size=4>
</form>
<hr>
</body>
</html>

Ce formulaire interroge une base unetelle sur le serveur malherbe.ujf-grenoble.fr, et propose l'interrogation de différents champs: aut, tit, dat etc.. puis de l'index global (interrogation d'un champ appellé " text ").

Le tag " database " pouvait référencer directement la base sur la machine locale,

sans passer par le serveur wais, dans ce cas, il aurait suffi de mettre :

<input NAME="database"
TYPE="hidden"
VALUE="unetelle">

Sfgate va alors chercher la base dans le répertoire que nous avons spécifié lorsque nous avons répondu à la question " what is the default path to the local wais databases? " lors de l'installation.

Options dinterrogation

opérateurs booléens:

Les opérateurs " and " et " or " sont supportés (ou " et " et " ou " si on a choisi la langue française (voir plus loin)). Les opérateurs booléens peuvent opérer entre les champs (tag " tie ") et également entre les mots à l'intérieur d'un champ (tag " tieinternal ").

<INPUT TYPE=" hidden " NAME=" tie " VALUE=" and ">

forcera le booléen " et " entre deux champs.

<INPUT TYPE=" hidden " NAME=" tieinternal " VALUE=" and ">

forcera le booléen " et " entre les mots d'un champ. On peut également proposer le choix par des " boutons radio " , par exemple :

Connecter les champs avec:<br>

<INPUT TYPE=" radio " NAME=" tie " CHECKED VALUE=" and "> et <br>

<INPUT TYPE=" radio " NAME=" tie " VALUE=" or "> ou <br>

Présentation des résultats dune interrogation

<HTML>
<HEAD>
<TITLE>Interrogation de la base Unetelle </TITLE>
</HEAD>
<BODY>
<H2>Interrogation de la base Unetelle </H2>
<br>
<hr>
<form METHOD=POST ACTION="http://www-mathdoc.ujf-grenoble.fr/cgi-bin/SFgate">
<INPUT TYPE="hidden" NAME="language" VALUE="french">
<INPUT TYPE="hidden" NAME="application" VALUE="unetelle">
<p>
<input NAME="database"
TYPE="hidden"
VALUE="malherbe.ujf-grenoble.fr/unetelle">
<INPUT TYPE="hidden" NAME="multiple" VALUE="1">
<INPUT TYPE="hidden" NAME="listenv" VALUE="table">
<INPUT TYPE="hidden" NAME="range" VALUE="1">
<INPUT TYPE="hidden" NAME="tie" VALUE="et">
<INPUT TYPE="hidden" NAME="tieinternal" VALUE="et">
<input type="submit" value="Lancer"> la recherche ..... ou .....
<INPUT TYPE=reset VALUE="Effacer la saisie">
<TABLE BORDER CELLPADDING="2">
<TR>
<TD><A HREF="/SemProba/autorite_aut.html">Auteur</A>
</TD>
<TD><INPUT TYPE=TEXT name="aut" SIZE="30">
</TD>
</TR>
<TR>
<TD> Mots du Titre
</TD>
<TD><INPUT TYPE=TEXT name="tit" SIZE="30">
</TD>
</TR>
<TR>
<TD><A HREF="/SemProba/autorite_cla.html">Classification</A>
</TD>
<TD><INPUT TYPE=TEXT name="cla" SIZE="30">
</TD>
</TR>
<TR>
<TD>Date
</TD>
<TD><INPUT TYPE=TEXT name="dat" SIZE="30">
</TD>
</TR>
<TR>
<TD><A HREF="/SemProba/autorite_kwd.html">Mots ClÈs</A>
</TD>
<TD><INPUT TYPE=TEXT name="kwd" SIZE="30">
</TD>
</TR>
<TR>
<TD>Mots du RÈsumÈ
</TD>
<TD><INPUT TYPE=TEXT name="des" size="30">
</TD>
</TR>
<TR>
<TD>Commentaires
</TD>
<TD><INPUT TYPE=TEXT name="com" size="30">
</TD>
</TR>
<TH>
<i>ou</i>
<TR>
<TD>Interrogation de l'index global
</TD>
<TD><INPUT TYPE=TEXT name="text" SIZE="30"></b>
</TD>
</TR>
</TABLE>
<p>
<input type="submit" value="Lancer"> la recherche ..... ou .....
<INPUT TYPE=reset VALUE="Effacer la saisie">
<p>
Nombre maximum de r&eacute;ponses? <input NAME="maxhits" TYPE=TEXT value="1000" size=4>
</form>
</body>
</html>

Conversion des résultats

Sfgate a une manière standard de présenter les documents récupérés: typiquement il écrit la headline en <H2> et le reste du document entre les balises <pre> et </pre>. Si cette présentation ne vous convient pas, il est possible de la modifier en écrivant une routine de conversion. Une routine de conversion est un module perl appellée <nom de convertisseur>.pm et qu'il faut installer dans le répertoire des " librairies perl " spécifié lors de l'installation à la réponse à la question " where should the perl libraries go "

Voici un exemple très simple de convertisseur, ou on écrit des balises html autour d'un URL, afin de le rendre cliquable.

package SFgate::Converter::inria;


use strict;


## #####################################################################
## convert
## #####################################################################
## interface for SFgate to convert one document
##
## (string) $text: document to convert
## (string) $headline: headline of document to convert
##
## By default every document is printed with its corresponding wais
## headline. If you want to derive another headline just change
## the $headline variable according to your needs.
##
## HTML special characters (&, <, >) should be encoded in text not
## being HTML code. To do this you can use the function
## being HTML code. To do this you can use the function
## &::encode_entities, e.g. $ntext = &::encode_entities($ntext)
## encodes the special chars in $ntext.
##
## returns:
## - string: the converted document ($ntext)
## - string: headline of converted document ($headline)
##
sub convert
{
my($text, $headline) = @_;
## local variables
my($ntext);
for (split(/\n/, $text)) {
next if /^$/;
s/http.*$/<A HREF="$&">$&<\/A>/g;
$ntext .= "<pre>$_<\/pre>";
}
return($ntext, $headline);
}


1;

Interrogation multibases


Il est facile d'écrire un formulaire permettant d'interroger plusieurs bases à la fois, pour cela il suffit de proposer différentes bases dans le formulaire à l'aide de " checkboxes ": Voici un petit exemple:

<HTML>
<TITLE>Consultation Multibases </TITLE>
</HEAD> <BODY BGCOLOR="#ffffe8" LINK="#05036" TEXT="#d50306" VLINK="#0748b4">
<A HREF="/"><IMG align=left hspace=10 SRC="/images/LMD.petit.gif"></A>
<H1>Consultation Multibases/Champs Documentaires (Ouvrages) </H1><p>
<hr>
Consultation des Bases d'Ouvrages des Bibliothèques de Mathématiques par <A HREF="/bibs/wais.html"> WAIS</A><p>
<form METHOD=GET ACTION="http://www-mathdoc.ujf-grenoble.fr/cgi-bin/SFgate">
<INPUT TYPE="hidden" NAME="language" VALUE="french">
<INPUT TYPE="hidden" NAME="range" VALUE="1">
<INPUT TYPE="hidden" NAME="application" VALUE="mathdoc">
<p>
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="omega.univ-lille1.fr//home/doclot/wais-bases/bib-math-lille"> Lille
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="malherbe.ujf-grenoble.fr/fourier"> Grenoble (Institut Fourier)
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="jack.univ-rennes1.fr:210/irmar/irmar-biblio"> Rennes (IRMAR)
<HR><p>
<INPUT TYPE="hidden" NAME="multiple" VALUE="1">
<H3>Crit&egrave;res de recherche </H3><p>
<ul>
<li>Les <b> Champs </b> sont connectés par l'opérateur <b>"et"</b>
<INPUT TYPE="hidden" NAME="tie" VALUE="et">
<INPUT TYPE="hidden" NAME="tieinternal" VALUE="and">
<p>
<li>A <b>l'intérieur</b> d'un champ:
<ul>
<!--<li> Vous pouvez utiliser l'opérateur <b>"et"</b> entre deux mots.
<li> Le <b>"ou</b>" logique est implicite..-->
<li> Le <b>"et </b>" logique est implicite
<li> Vous pouvez utiliser l'opérateur <b>"ou"</b> entre deux mots.
</ul>
</ul>
<p>
</dl>
<hr>
<PRE>
<pre>
Index global : <input type="text" name="text" size=40><P>
<hr>
<b> ou : </b>
Auteur : <input type="text" name="aut" size=40>
Mots Clés : <input type="text" name="mcl" size=40>
Date : <INPUT TYPE=TEXT name="dat" SIZE="40">
</pre>
<p><hr>
<input type="submit" value="Lancer"> la recherche.
<INPUT TYPE=reset VALUE="Annuler"><br>
<input NAME="maxhits" TYPE=TEXT value="40" size=3> Combien de r&eacute;ponses?
(40 par défaut)
</form>
</body>
</html>

Interrogation multibases avec noms de champs hétérogènes


L'exemple précédent était suffisant pour interroger un ensemble de bases ayant toutes les mêmes noms de champs: " aut ", " tit ", " dat " etc... mais que se passe-t-il quand on veut interroger des bases ayant des noms de champs hétérogènes? Ici encore on fait appel au répertoire " applications " dans lequel se trouve un " template " , appelé " lattice " ou ossature complète qu'on va pouvoir utiliser pour définir des " champs génériques ", ensuite pour chaque base interrogée, on fera la correspondance entre les champs génériques de la " lattice " et les noms de champs réels de chaque base.

Voici un fichier " lattice-fr ", traduction française du fichier " lattice " fourni dans la distribution:

TOP
  mots-clés
    sujet
      texte-integral
        titre
          titre-livre
          titre-article
          titre-série
        résumé
        descripteur-sujet
      titre-journal
    créateur
      nom-auteur
      nom-directeur
      collectif
      conférence
    éditeur
      nom-éditeur
      adresse-éditeur
  date
    date-entrée
    date-publication
  meta
    issn
    isbn
    crc
    volume
    numéro
    édition

Et voici, pour une base, le fichier faisant la correspondance entre les champs du fichier " lattice " et les noms réels: ce fichier s'appelle " rennes-irmar " et se trouve également dans le répertoire " applications "

$server = 'jack.univ-rennes1.fr';
$port = '210';
$name = 'irmar/irmar-biblio';

$attributes = {
'dat:text' => 'date-publication',
'aut:text' => 'nom-auteur',
'tit:text' => 'titre-livre',
'mcl:text' => 'sujet',
'global:text' => 'mots-clés',
};

Voici enfin l'exemple du formulaire faisant appel à cette possibilité d'utiliser les bases hétérogènes: (Notez en particulier les tags " attributes " et " lattice ", et les noms des champs interrogés, notez aussi que pour que cela fonctionne il est indispensable d'avoir défini une " application " )

<HTML>
<HEAD>
<TITLE>Consultation Multibases </TITLE>
</HEAD>
<BODY BGCOLOR="#ffffe8" LINK="#05036" TEXT="#d50306" VLINK="#0748b4">
<A HREF="/"><IMG align=left hspace=10 SRC="/images/LMD.petit.gif"></A>
<H1>Consultation Multibases/Champs Documentaires (Ouvrages) </H1><p>
<hr>
Consultation des Bases d'Ouvrages des Bibliothèques de Mathématiques<p>

<FORM METHOD="get" ACTION="http://www-mathdoc.ujf-grenoble.fr/cgi-bin/SFgate">

<INPUT TYPE="hidden" NAME="application" VALUE="mathdoc">
<INPUT TYPE="hidden" NAME="language" VALUE="french">
<INPUT NAME="attributes" TYPE="hidden" VALUE="1">
<INPUT NAME="lattice" TYPE="hidden" VALUE="lattice-fr">
<INPUT TYPE="hidden" NAME="range" VALUE="1">
<INPUT TYPE="hidden" NAME="listenv" VALUE="table">
<p>
<DL>
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="fourier"> Grenoble (Institut Fourier)
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="lille"> Lille
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="rennes-irmar"> Rennes (IRMAR)
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="rennes-irem"> Rennes (IREM)
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="polytechnique"> Polytechnique (bibliothèque générale)
<DT>
<DD><input NAME="database"
TYPE="checkbox"
VALUE="histoire_sciences"> Histoire des Sciences
</DL>
<HR><p>
<INPUT TYPE="hidden" NAME="multiple" VALUE="1">
<H3>Crit&egrave;res de recherche </H3><p>
<ul>
<li>Les <b> Champs </b> sont connectés par l'opérateur <b>"et"</b>
<INPUT TYPE="hidden" NAME="tie" VALUE="et">
<INPUT TYPE="hidden" NAME="tieinternal" VALUE="and">
<p>
<li>A <b>l'intérieur</b> d'un champ:
<ul>
<li> Le <b>"et </b>" logique est implicite
<li> Vous pouvez utiliser l'opérateur <b>"ou"</b> entre deux mots.

</ul>
</ul>
<p>
</dl>
<hr>
<PRE>
<pre>
Index global : <input type="text" name="text" size=40><P>
<hr>
<b> ou : </b>
Auteur : <input type=text name="nom-auteur" size=40>
Mots du Titre: <input type=text name="titre-livre" size=40>
Mots Clés : <input type=text name="sujet" size=40>
Date : <INPUT TYPE=TEXT name="date-publication" SIZE="40">
</pre>
<p><hr>
<input type="submit" value="Lancer"> la recherche.
<INPUT TYPE=reset VALUE="Annuler"><br>
<input NAME="maxhits" TYPE=TEXT value="40" size=3> Combien de r&eacute;ponses?
(40 par défaut)

</form>
</html>

Ce cours ne traite que des principales possibilités de Sfgate. la documentation fournie dans le fichier Sfgate.ps est plus complète, même si parfois un peu difficile à comprendre.