Très lègrement modifié en novembre 2000.
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.
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
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:
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).
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.
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:
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*/
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.
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.
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>/
region: /^<META NAME="title" CONTENT="/ /^<META NAME="title"
CONTENT="/
region: /^<META NAME="keywords" CONTENT="/ /^<META NAME="keywords"
CONTENT="/
region: /^[0-9][0-9][0-9] / /^[0-9][0-9][0-9] */
region: /^<DES>/ /^<DES> */
region: /^\\[/
region: /^<EM>Classification<\/EM> : /
/^<EM>Classification<\/EM> : */
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: /">/
tit TEXT LOCAL
end: /">/
kwd TEXT LOCAL
end: /">/
dat TEXT LOCAL
end: /[0-9][0-9]$/
des TEXT LOCAL
end: /^<\/DES>/
com TEXT LOCAL
end: /\\]/
cla TEXT LOCAL
end: /^<P>/
waisindex -d <base> -T HTML -t fields -export -l 10 -r <nom de répertoire>/*/*.html
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.
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.
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é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.
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>
<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éponses? <input NAME="maxhits" TYPE=TEXT
value="1000" size=4>
</form>
</body>
</html>
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;
<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è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éponses?
(40 par défaut)
</form>
</body>
</html>
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è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éponses?
(40 par défaut)
</form>
</html>