|

MOTORE DI RICERCA INTERNO

Se
avete un sito con parecchio materiale ad un certo punto
è una scelta quasi obbligata quella di implementare
un sistema di ricerca interno al sito stesso.
Esistono alcuni siti specializzati nell’offrire, gratuitamente,
strumenti di ricerca o di mappatura delle pagine: basti
ricordare, per esempio, FreeFind (http://www.freefind.com)
I limiti di questo sistema sono fondamentalmente due:
l’interfaccia grafica dei risultati della ricerca non
è personalizzabile se non in minima parte.
Inoltre la ricerca viene eseguita solo su pagine html:
se nel vostro sito avete utilizzato pagine in ASP, tale
pagine non verranno indicizzate.
Per
risolvere queste limitazioni possiamo, grazie all’ASP,
realizzare un motore di ricerca interno.
Facciamo qui riferimento alla sezione ‘Search’ del sito
AmicoPc, visibile all’indirizzo http://www.amicopc.com/search/index.htm
CERCA.MDB
Abbiamo innanzitutto bisogno di un database di access
che chiameremo ‘cerca.mdb’ e che dovrà essere memorizzato
nella sottocartella ‘database’. In tale database creiamo
una tabella (che chiameremo ‘cerca’) nella quale dovranno
esistere tre campi: il primo campo ‘id’ è un
campo contatore; il secondo campo ‘percorso’
è un campo di testo (massimo 255 caratteri e non solo
50) mentre l’ultimo campo ‘descrizione’ dovrà
essere un campo memo.
In tale database dovremo memorizzare il percorso
delle singole pagine (esempio ‘http://www.amicopc.com/pagina1.htm')
nel relativo campo 'percorso'; nel campo ‘descrizione’,
invece, inseriremo le parole chiave da associare a quella
pagina (esempio: computer, internet, asp... e così via).
Personalmente consiglio di fare un copia - incolla dell’intera
pagina in tale campo: così facendo non c’è bisogno di
scegliere le parole chiave pagina per pagina ma è sufficiente
copiare tutte le pagine nei vari record e inserirne
solo il relativo indirizzo.
Inoltre, così facendo, la ricerca darà risultati decisamente
migliori e più precisi.
CERCA.HTM
Una volta preparato il database prepariamo il modulo
che ci consente di inserire le parole chiave da cercare.
Pertanto creiamo una nuova pagina html e inseriamo un
modulo che faccia riferimento alla pagina ‘risultati.asp’
con il metodo get.
Inseriamo poi un campo di testo a riga singola (che
chiameremo ‘form_chiave’) e inseriamo due pulsanti
di opzione (che chiamiamo ‘tipo’), di cui il
primo, che dovrà essere selezionato, avrà come valore
‘tutte’, mentre il secondo avrà come valore ‘frase’.
Il primo pulsante corrisponde all’opzione ‘cerca tutte
le parole’, mentre il secondo corrisponde all’opzione
‘cerca frase esatta’.
Per
intenderci: se io inserisco le parole ‘computer’ e ‘darty’
(per non complicarci la vita non facciamo distinzione
tra maiuscole e minuscole) selezionando l’opzione ‘tutte’,
mi verranno proposte le pagine che contengono entrambe
le parole, anche se poste a distanza tra loro (per esempio:
‘il computer nuovo del mio amico Darty’).
Selezionando invece l’opzione ‘frase’ vengono presentate
solo le pagine che contengono le due parole vicine (quindi
le pagine che contengono la frase ‘computer darty’)
Il
codice di questa pagina dovrebbe essere qualcosa del
tipo
|
<html>
<body>
<form
method="get" action="risultati.asp">
<p>Cerca<br>
<input
type="text" name="form_chiave"
size="20"></p>
<p><input
type="radio" value="tutte"
name="tipo" checked>tutte le parole</p>
<p><input
type="radio" value="frase"
name="tipo">frase esatta</p>
<p><input
type="submit" value="Invia"
name="B1"><input type="reset"
value="Reimposta" name="B2"></p>
</form>
</body>
</html>
|
Il
modulo appena riportato utilizza il metodo get
anziché il metodo post: il metodo post
serve per inviare i dati ad una pagina o un programma
(per esempio cgi bin), mentre il metodo get serve
per richiamare una pagina, inserendo nel link di collegamento
i valori inseriti nei campi del modulo stesso.
Quindi se io ho un campo key in cui inserisco
la parola prova, cliccando sul bottone di invio
mi verrà caricata la pagina search.asp?key=prova
Il motivo per cui utilizziamo questo metodo
è semplicemente quello di poter avere, direttamente
nel link di collegamento, le variabili che ci interessano
(parole da cercare, se tutte le parole o la frase esatta
e così via), senza bisogno di ricorrere a session
o quant'altro.
Pertanto questa pagina non preleva i dati utilizzando
request.form bensì utilizza il request.string,
in quanto le variabili sono contenute nella stringa
dicollegamento.
RISULTATI.ASP
Per comodità visualizzeremo i risultati in una pagina
simile a quella già vista quando abbiamo parlato di
‘paginazione’, ovvero un certo numero di record per
ogni pagina (nel nostro caso erano cinque ma ora ne
impostiamo venti), con la possibilità di visualizzare
ulteriori risultati.
Questa pagina dovrà mostrarmi i primi venti risultati
visualizzando anche alcune righe di ogni pagina trovate.
Inoltre dovrà mostrare il numero di risultati trovati,
nonchè il numero della pagina su cui ci troviamo (per
esempio ‘pagina 1 di 5’)
Come
prima cosa includiamo il file ‘adovbs.inc’
|
<!--
#INCLUDE FILE="adovbs.inc" -->
|
A
questo punto preleviamo dalla stringa di collegamento
i parametri relativi alle parole chiave da cercare e
al tipo di ricerca da effettuare, sempre utilizzando
la funzione ‘request.querystring(“parametro”)’
|
<%
Dim
prechiave
Dim
tipo
prechiave=request.querystring("form_chiave")
tipo=request.querystring("tipo")
|
Nel
caso in cui l’utente abbia selezionato l’opzione ‘tutte
le parole’ la stringa di ricerca dovrebbe essere del
tipo: «seleziona nella tabella ‘cerca’ tutti i valori
in cui il campo ‘descrizione’ corrisponde alla PRIMA_PAROLA
e il campo ‘descrizione’ corrisponde alla SECONDA_PAROLA».
Se invece usassimo una stringa del tipo «seleziona nella
tabella ‘cerca’ tutti i valori in cui il campo ‘descrizione’
corrisponde alla PRIMA_PAROLA e alla SECONDA_PAROLA»
cercheremmo la ‘frase esatta’.
Quindi
dobbiamo sostituire, nella variabile ‘prechiave’, gli
spazio vuoti con “ %'and descrizione like'% ” in modo
che sia possibile cercare più parole ma non necessariamente
tra loro vicine (questo 'trucco' è tratto dalla newsletter
‘Uno script al giorno’ del sito http://www.aspitalia.com)
Utilizziamo
quindi la funzione Replace che è così strutturata: variabile
da modificare, che cosa sostituire, con che cosa sostituire.
In questo caso vediamo che la variabile da modificare
è ‘prechiave’ e dovremo sostituire gli spazi vuoti fra
una parola e l’altra (“ “) con la frase contenuta nella
variabile ‘change’
|
if
tipo="tutte" then
change="%'and
descrizione like'%"
chiave=Replace(prechiave,"
", change)
|
Nel
caso in cui l’utente abbia selezionato invece selezionato
l’opzione ‘frase esatta’, avremo che la chiave di ricerca
corrisponde alle parole inserite nel modulo senza bisogno
di nessuna sostituzione.
|
else
chiave=prechiave
end
if
|
La parte che segue è uguale a quella che già abbiamo
visto in precedenza parlando di 'paginazione', quindi
non necessità di approfonditi commenti.
Apro comunque la connessione con il database ‘cerca.mdb’
ed effettuo la ricerca nel database.
|
Dim
iPageSize
' Numero di record da visualizzare
Dim
iPageCount
'Numero di pagine totali che otteniamo dalla query
Dim
iPageCurrent
'Pagina corrente
Dim
strOrderBy
'Parametro in base a cui definire l'ordinamento
Dim
strSQL
' Comando da eseguire
Dim
RS
' Il solito Recordset
Dim
iRecordsShown
' Variabile usata per definire i record mostrati
Dim
miastringa
' Variabile utilizzata per la visualizzazione
dei risultati
Dim
nuovastringa
' Variabile utilizzata per la visualizzazione
dei risultati
iPageSize
= 20
'Imposto il numero di record visualizzat
If
Request.QueryString("page") = ""
Then
iPageCurrent = 1
Else
iPageCurrent = CInt(Request.QueryString("page"))
End
If
If
Request.QueryString("order") = ""
Then
strOrderBy = "id"
Else
strOrderBy = Request.QueryString("order")
End
If
Dim
Conn
Set
Conn = Server.CreateObject("ADODB.Connection")
conn.Open
"driver={Microsoft Access Driver (*.mdb)};dbq="
& server.mappath("database/cerca.mdb")
Set
rs = Server.CreateObject("ADODB.Recordset")
sql
= "SELECT * FROM cerca where descrizione
like '%"&chiave&"%' ORDER BY
" & strOrderBy & " DESC;"
RS.Open
sql, conn, adOpenKeyset
RS.PageSize
= iPageSize
RS.CacheSize
= iPageSize
iPageCount
= RS.PageCount
If
iPageCurrent > iPageCount Then iPageCurrent
= iPageCount
If
iPageCurrent < 1 Then iPageCurrent = 1
|
I
simboli % presenti prima e dopo la variabile chiave
(nella query di ricerca) corrispondono all'asterisco
del DOS, ovvero sostituiscono qualsiasi carattere.
In questo modo è possibile efettuare una ricerca
anche per frammenti di parola. Infatti
Per esempio inserendo la parola comp, grazie
alla presenza di questi simboli, verranno visualizzate
le parole computer, accompagnatore
e così via.
Se non si vuole effettuare questo tipo di ricerca è
sufficiente eliminarli dal codice.
Conto
ora i risultati trovati e ne memorizzo il numro nella
variabile totale
|
Dim
totale
totale=rs.recordcount
|
Nel
caso in cui non si siano trovata nessuna pagina corrispondente
ai criteri specificati, carichiamo la pagina ‘search_again.htm’
che vedremo dopo.
|
If
iPageCount = 0 Then
response.redirect("search_again.htm")
Else
RS.AbsolutePage = iPageCurrent
%>
|
Cominciamo
a mostrare il numero di record trovati
|
<p
align=“center”><font color="cc0000"><b>
La ricerca ha prodotto <% = totale %>
risultati</b></font></p>
|
Comincia
la visualizzazione dei risultati
|
<%
iRecordsShown
= 0
Do
While iRecordsShown < iPageSize And Not RS.EOF
%>
|
Innanzitutto
visualizziamo il link verso la pagina trovata, in modo
che possa essere cliccato. Tale link è memorizzato nel
campo ‘percorso’ del nostro database, quindi avremo
|
<p><a
href="<%= rs("percorso")%>"><%=
rs("percorso")%></a><br>
|
A
questo punto visualizziamo i primi duecento caratteri
di quella stessa pagina: per fare questo utilizziamo
la funzione ‘Mid( variabile_da_modificare, primo_carattere_da_visualizzare,
ultimo_carattere_da_visualizzare)’, aggiungendo alla
fine i tre punti di sospensione (...)
Nel
nostro caso tale funzione sarà ‘Mid( miastringa, 1,
200)’
|
<font
face="Verdana, Arial, Helvetica, sans-serif"
size="1"><%
miastringa
= RS("descrizione")
nuovastringa
= Mid( miastringa, 1, 200)
response.write(nuovastringa)&"..."
%></font></p>
|
Continuo
poi a mostrare i risultati successivi
|
<%
iRecordsShown
= iRecordsShown + 1
RS.MoveNext
Loop
End
If
|
Quando
ho finito posso chiudere la connessione e il recordset
|
RS.Close
Set
RS = Nothing
Conn.Close
Set
Conn= Nothing
%>
|
A
questo punto visualizziamo il numero di pagina in cui
ci troviamo
|
<font
face="Verdana, Arial, Helvetica, sans-serif"
size="2">Pagina <%= iPageCurrent%>
di <%= iPageCount%></font>
|
Infine
creiamo, se servono, i link ‘avanti’ e ‘indietro’
|
<%
If
iPageCurrent <> 1 Then
%>
<a
href="risultati.asp?page=<%= iPageCurrent
- 1 %> &order=<%= Server.URLEncode(strOrderBy)
%> &form_chiave=<% = prechiave %>&tipo=<%
= tipo %>"> indietro</a>
<%
end if %>
<%If
iPageCurrent < iPageCount Then %>
<a
href="risultati.asp?page=<%= iPageCurrent
+ 1 %> &order=<%= Server.URLEncode(strOrderBy)
%> &form_chiave=<% = prechiave %>&tipo=<%
= tipo %>"> avanti ></a>
<%
end if %>
|
Fatto
questo abbiamo finito
SEARCH_AGAIN.HTM
Il
file ‘search_again.htm’ è identico al file ‘cerca.htm’
che abbiamo visto prima. L’unica differenza è data da
un messaggio che avverte l’utente del fatto che non
si siano trovate pagine corrispondenti ai criteri di
ricerca impostati: quindi lo si invita ad effettuare
una nuova ricerca.
|