|
ASP: la guida introduttiva
Capitolo 11 - Un motore di ricerca con ASP (Parte 1)
11.0 Introduzione
al tutorial
11.1 Concettualizzazione
del problema
11.2 Costruzione
del database
11.3 Eseguire
la ricerca
11.0 - Introduzione al tutorial
Con
questo capitolo, e con il successivo, si intende guidare il
lettore alla realizzazione di un motore di ricerca, mettendo a
frutto le nozioni acquisite nel corso delle lezioni precedenti,
ed in particolare dei capitoli 9 e 10 relativi all'utilizzo
delle fonti di dati di Access tramite ADO e SQL.
Per seguire e realizzare quanto suggerito da questo tutorial è
necessario disporre, oltre della solita postazione windows
munita di un server come IIS o PWS, di una copia di Access,
preferibilmente la versione 2000, anche se le versioni come la
97 o la 98 sono ugualmente valide.
Quello che si intende realizzare è un servizio di ricerca
costruito sulla consultazione di una base di dati (ossia un
database) all'interno della quale sono indicizzate una serie di
pagine Web consultabili tramite un comune browser. Non si
intende certo analizzare le tecniche di realizzazione dei più
complessi motori di ricerca, come quelli sfruttati
quotidianamente in rete dagli utenti di internet, che
indicizzato milioni e milioni di pagine. Si intende invece
riprodurre quel servizio che va comunemente sotto il nome di
"motore di ricerca interno", utilizzato soprattutto da siti
dagli ampi contenuti per aiutare il visitatore nel localizzare
velocemente mediante l'utilizzo di alcune parole chiave la
risorsa cercata. Si tratta perciò di un servizio efficiente
finché le pagine memorizzate nel database non superino diverse
migliaia, numero più che sufficiente anche per un sito di ampie
dimensioni!
11.1 - Concettualizzazione del problema
Come
al solito è necessario partire chiarendo le proprie idee sul da
farsi, concettualizzando il problema proposto e predisponendo
una schema per la successiva soluzione del medesimo. Come già
annunciato l'intero servizio fa perno sul fatto di aver
precedentemente indicizzato una serie di pagine Web. Ma come
realizzare tale opera? L'utilizzo di un database risulta in casi
come questo estremamente utile, sia per l'efficienza del
servizio stesso, sia per rendere più facile il compito dello
sviluppatore. Stabilito quindi che l'archiviazione dei dati
avverrà tramite un database resta da decidere una volta per
tutte in che maniera questo dovrà avvenire. Quello che interessa
nel problema è la possibilità di ricercare nell'intero archivio
una serie di pagine attinenti con i concetti espressi
dall'utente mediante l'utilizzo di alcune parole chiave. Sarà
quindi necessario dotare la tabella creata allo scopo
all'interno del database almeno dei seguenti quattro campi:
-
Titolo della pagina Web
-
URL della pagina Web
-
Descrizione dei contenuti della pagina Web
-
Una serie di parole chiave associate alla pagina Web
Successivamente è necessario realizzare uno script, integrato
ovviamente in una o più pagine ASP, in grado di accedere alla
fonte di dati al fine di estrarne delle informazioni che
soddisfino la richiesta dell'utente. Come visto nei due capitoli
precedenti questo diventa molto semplice grazie all'utilizzo di
ADO (ActiveX Data Object), oggetto ActiveX utilizzabile per
accedere con semplicità a database di varia natura. Per coerenza
con lo standard di ASP il database utilizzato per l'esempio sarà
generato con Access 2000.
11.2 - Costruzione del database
Una
volta chiarito quanto detto sinora è possibile procedere alla
realizzazione del servizio, partendo ovviamente
dall'allestimento del database necessario. Si apra la propria
copia di Access e dal menù iniziale si selezioni la voce
"Database di Access vuoto". Nella finestra seguente verrà
chiesto dove si intende posizionare il file e che nome dargli.
Si scelga la propria cartella di lavoro interna al Web Server
utilizzato, e si nomini il database come
archivio.mdb. Fatto ciò il lettore disporrà di un
database completamente vuoto, con la possibilità di interagire
con esso tramite gli strumenti visuali messi a disposizione da
Access. A questo va dato il merito dell'estrema
semplicità d'uso. Bastano pochi tentativi per acquisire la
pratica necessaria alla creazione di database anche piuttosto
complessi. Per prima cosa bisogna procedere ora inserendo nel
database una nuova tabella. Le tabelle sono elementi cardine nei
database come quelli prodotti da Access, ed è al loro interno
che tutte le informazioni vengono archiviate. Si selezioni
allora l'opzione "Crea una tabella in visualizzazione
struttura", uno dei tool più efficaci di questo. Da qui
è ora possibile gestire i campi che faranno parte della tabella,
specificandone il nome ed il tipo. Come primo campo si inserisca
il campo id, di tipo
contatore. Questo tipo di dato
permette di associare in maniera automatica un numero intero
positivo ad ogni record della tabella. Successivamente
selezionare il campo id come chiave primaria. In Access è
semplice selezionare un campo come chiave primaria: basta
evidenziare in visualizzazione struttura il campo stesso e
quindi utilizzare l'icona raffigurante una chiave presente nella
barra degli strumenti del programma. A questo punto è possibile
dotare la tabella dei quattro campi sopra discussi, seguendo
questo schema:
-
campo titolo, di tipo
testo. Tra i valori del riquadro
sottostante regolare la voce "Dimensione campo" su 100. Questo
farà sì che i titoli delle pagine Web che indicizzeremo in
seguito possano avere lunghezza compresa tra 1 e 100
caratteri.
-
campo url, di tipo
testo. Si regoli anche qui su 100
la dimensione del campo. In questa maniera si è previdenti nei
confronti di URL molto lunghi ed articolati.
-
campo descrizione, di tipo
memo. Il tipo memo consente
l'archiviazione di dati dalla lunghezza non determinata a
priori. In questo caso, perciò, le descrizioni che associeremo
alle singole pagine Web potranno avere lunghezza variabile.
-
campo keywords, di tipo
memo. Vale lo stesso discorso di
sopra. Grazie al tipo memo sarà possibile inserire quante
parole chiave si ritiene necesario.
Adesso è necessario salvare quanto fatto. Access chiederà di
assegnare un nome alla tabella. Per questo esempio si scelga il
nome pagineweb. Il lavoro di
costruzione del database è completo. E' anche possibile chiudere
la finestra di visualizzazione struttura. Si inseriscano ora,
allo scopo di effettuare dei test in seguito, una serie di
pagine Web dimostrative. Per farlo basta un doppio click sul
nome della tabella nella finestra principale del database. Ad
esempio:
-
titolo: Sauron - Risorse per il
webmaster
-
url: http://www.sauronsoftware.it
-
descrizione: Una serie di raccolte utili
a tutti i tipi di webmaster
-
keywords: risorse webmaster HTML ASP
JavaScript icone fonts gif animate mailing list
Come
è possibile osservare il campo keywords è rappresentato da una
serie di parole separate tra di loro da uno spazio. Questa sono
le famose parole chiave associate alla pagina Web. Ciò significa
che se un utente digiterà in fase di ricerca la parola "HTML"
vedrà certamente tra i risultati la pagina "Sauron -
Risorse per il webmaster", mentre non vedrà altre eventuali
pagine archiviate che non contengano nel campo keywords questa
parola chiave. Seguendo il modello proposto si inseriscano
perciò una serie di pagine Web per testare poi l'esempio. Dopo
aver salvato nuovamente il lavoro è anche possibile chiudere
Access. Si passa ora alla realizzazione della pagina di
consultazione della fonte di dati realizzata.
11.3 - Eseguire la ricerca
Dopo
aver predisposto il database che si intende utilizzare è
necessario implementare uno script in grado di fare da tramite
tra l'utente e i dati immagazzinati nell'archivio. Poiché tale
script per funzionare correttamente necessita di una serie di
dati in input da parte dell'utente bisognerà senz'altro
predisporre un form HTML. Questo è piuttosto semplice da
realizzare. Le interrogazioni al database, quindi, partiranno
dal seguente documento Web, che per praticità può essere
battezzato cerca.htm:
<html>
<head>
<title>Motore di ricerca</title>
</head>
<body>
<form action="risultati.asp" method="POST">
Parole chiave:<br>
<input type="text" name="keywords">
<input type="submit" value="CERCA">
</form>
</body>
</html>
Le
parole inserite dall'utente vengono perciò inviate, con metodo
POST, al documento risultati.asp.
Come è facile intuire sarà questa pagina a dover inglobare tanto
lo script in grado di eseguire la ricerca, quanto quello in
grado di produrre il giusto output corrispondente. Ci si
dedicherà perciò ora alla realizzazione di questo importante
file.
Come prima cosa è necessario recuperare le parole inviate
tramite il form di cerca.htm:
var testo = String(Request.Form("keywords"));
if (testo=="" || testo=="undefined") Response.Redirect("cerca.htm");
Nel
caso l'utente avesse inviato il contenuto del form senza
inserire alcuna parola chiave allora il processo di ricerca
nemmeno sarà avviato, e l'utente sarà rimandato direttamente a
cerca.htm, in maniera a lui invisibile.
Tutte le parole chiave inserite saranno naturalmente suddivise
tra di loro mediante uno o più spazi. E' allora necessario
separare tra di loro le singole parole inviate, facendo ricorso
al metodo split dell'oggetto String
di JScript:
var keywords = testo.split(" ");
keywords
sarà dunque un'Array dove ogni elemento rappresenterà una parola
distinta. Fatto ciò è possibile aprire la connessione verso la
fonte di dati che si intende consultare:
var stringaDiConnessione = "driver={Microsoft Access Driver (*.mdb)};dbq=";
stringaDiConnessione += Server.MapPath("archivio.mdb");
var conn = new ActiveXObject("ADODB.Connection");
conn.Open(stringaDiConnessione);
Il
passo successivo consiste nel formulare correttamente una query,
ossia una richiesta, basata sulla sintassi di SQL, da sottoporre
alla fonte di dati verso la quale la connessione è stata aperta.
Si faccia particolare attenzione alla seguente porzione di
codice:
var sql = "SELECT * FROM pagineweb WHERE";
for (i=0;i<keywords.length;i++) {
if (i>0) sql += " AND";
sql += "keywords LIKE '%" + keywords[i] + "%'";
}
Se
ad esempio l'utente avesse digitato la coppia di parole "gif
animate" la query risultante sarebbe:
SELECT * FROM pagineweb WHERE keywords LIKE '%gif%' AND keywords
LIKE '%animate%'
Formulata correttamente la query sarà possibile chiedere tramite
ADO la restituzione dei record competenti:
var ris = conn.Execute(sql);
La
variabile ris, quindi, conterrà un
riferimento ad un oggetto Recordset
rappresentante tutti i record ospitati dalla tabella pagineweb
in grado di soddisfare la richiesta fatta. Non resta che
scorrere tale Recordset inserendo nell'output una
rappresentazione HTML dei suoi contenuti:
if (ris.EOF) Response.Write("<b>NESSUN DOCUMENTO
TROVATO</b>");
else while (!ris.EOF) {
Response.Write("<p><a href='" + ris("url") + "'>");
Response.Write(ris("titolo"));
Response.Write("</a><br>");
Response.Write(ris("descrizione"));
Response.Write("</p>");
ris.MoveNext();
}
La
connessione al database può quindi essere chiusa, la pagina ASP
è completa.
conn.Close();
Il
codice che ne risulta è il seguente:
<%@ LANGUAGE = JScript %>
<%
var testo = String(Request.Form("keywords"));
if (testo=="" || testo=="undefined") Response.Redirect("cerca.htm");
var keywords = testo.split(" ");
var stringaDiConnessione = "driver={Microsoft Access Driver (*.mdb)};dbq=";
stringaDiConnessione += Server.MapPath("archivio.mdb");
var conn = new ActiveXObject("ADODB.Connection");
conn.Open(stringaDiConnessione);
var sql = "SELECT * FROM pagineweb WHERE";
for (i=0;i<keywords.length;i++) {
if (i>0) sql += " AND";
sql += " keywords LIKE '%" + keywords[i] + "%'";
}
var ris = conn.Execute(sql);
if (ris.EOF) Response.Write("<b>NESSUN DOCUMENTO TROVATO</b>");
else while (!ris.EOF) {
Response.Write("<p><a href='" + ris("url") + "'>");
Response.Write(ris("titolo"));
Response.Write("</a><br>");
Response.Write(ris("descrizione"));
Response.Write("</p>");
ris.MoveNext();
}
conn.Close();
%>
Questo breve e conciso script è in grado di eseguire la basilare
ricerca sul database che si voleva soddisfare. Al solito si
tratta di un puro esempio, che lascia spazio ad ampi margini di
miglioramento. Si propongono quindi al lettore delle possibili
migliorie, da eseguire come esercizio:
-
possibilità da parte dell'utente di stabilire diverse modalità
di ricerca, come "tutte le parole", "almeno una parola" e
"frase esatta". L'esempio appena visto soddisferebbe il caso
"tutte le parole". Basta modificare la parte di codice che
assembla la query, in base alla scelta fatta dall'utente. Nel
caso "almeno una parola" basterebbe infatti sostituire nella
query l'operatore OR
all'operatore AND. Nel caso
"frase esatta", invece, non occorre far ricorso ad alcun
operatore, basta specificare nella quary
keywords LIKE '%parola1 parola2 parola3%'. Neanche lo
split sarebbe più necessario.
-
aumentare la robustezza dello script. Qualora l'utente
inserisse infatti un carattere di apostrofo nel campo di
ricerca lo script restituirebbe un errore. Questo perchè il
carattere apostrofo ha particolare significato nella sintassi
SQL. Bisogna quindi accertarsi di sostituire ogni carattere di
apostrofo ' con un doppio apostrofo ''. E' questo lo
stratagemma usato da SQL per inserire nei campi stringa delle
query il carattere riservato.
-
fondere le pagine cerca.htm e ricerca.asp in un unico
documento, per maggiore praticità.
-
il
metodo split, per quanto di facile utilizzo, non ha la
potenza, ad esempio, di uno StringTokenizer di Java, o degli
equivalenti metodi di Perl. Se l'utente dovesse inserire
consecutivamente due spazi, infatti, il metodo split
inserirebbe un elemento totalmente vuoto nell'Array risultante
e la ricerca sarebbe in questo caso falsata. E' però possibile
lavorare intorno a split per ottenere un Array più accurato e
privo di questo inconveniente.
Il
prossimo capitolo concluderà il tutorial, proponendo la
realizzazione di un pannello di controllo per l'inserimento via
interfaccia Web di nuove pagine all'interno dell'archivio.
|