PDA

View Full Version : motore di ricerca interno...ASP...


SteR9
21-02-2004, 17:59
a scuola stiamo facendo un sito per un progetto e avrei bisogno di implementare un motore di ricerca interno,però non so come va strutturato un motore di ricerca, nel senso che non ho capito se devo andare a inserire i contenuti di tutte le pagine in un database e poi andare a fare la ricerca della parola tramite una query oppure se devo lavorare tramite parole chiave inserendo nel database solo alcune parole che fanno riferimento poi alle pagine...questi sono i due modi che mi sono venuti in mente...qual'è quello giusto?ce ne sono altri?
grazie

cionci
22-02-2004, 03:22
Sono entrambi giusti...dipende sempre da ciò che vuoi fare...
Se le pagine sono poche fai prima a cercare le parole all'interno di tutti i file... Se i contenuti sono dinamici devi cercare all'interno dei campi del DB...

SteR9
22-02-2004, 08:03
Originariamente inviato da cionci
Sono entrambi giusti...dipende sempre da ciò che vuoi fare...
Se le pagine sono poche fai prima a cercare le parole all'interno di tutti i file... Se i contenuti sono dinamici devi cercare all'interno dei campi del DB...
le pagine sono sempre le stesse quindi pensavo di non andare a inserire il testo di ogni singola pagina in un db...
per andare a cercare all'interno del file intendi andare a cercare dentro alla pagina??se si come si fa?

cionci
22-02-2004, 08:28
Con PHP puoi semplicemente usare l'istruzione "file" che ti legge un file e te lo mette in un vettore... Ti va a finire una linea di testo per ogni elemento del vettore...

Semplicente dovrai usare strstr su ogni riga del vettore per trovare la corrispondenza della parola che stai cercando...

SteR9
22-02-2004, 09:18
Originariamente inviato da cionci
Con PHP puoi semplicemente usare l'istruzione "file" che ti legge un file e te lo mette in un vettore... Ti va a finire una linea di testo per ogni elemento del vettore...

Semplicente dovrai usare strstr su ogni riga del vettore per trovare la corrispondenza della parola che stai cercando...
purtroppo il progetto impone di utilizzare asp... come si potrebbe fare con asp?
grazie :)

cionci
22-02-2004, 10:03
Scusa...non capisco per quale motivo avevo letto PHP ;)

Allora in ASP ci sono le funzioni dell'oggetto FileSystemObject:

http://msdn.microsoft.com/library/en-us/script56/html/sgWorkingWithFiles.asp?frame=true

SteR9
22-02-2004, 10:07
Originariamente inviato da cionci
Scusa...non capisco per quale motivo avevo letto PHP ;)

Allora in ASP ci sono le funzioni dell'oggetto FileSystemObject:

http://msdn.microsoft.com/library/en-us/script56/html/sgWorkingWithFiles.asp?frame=true
immaginavo di dover usare FileSystemObject..però questo permette di leggere o un determinato numero di caratteri o una linea o tutto il file...
mettiamo caso che voglia leggere linea per linea come faccio poi a controllare che una parola sia contenuta dentro a una linea di testo?

cionci
22-02-2004, 10:23
Ci dovrebbe essere la funzione instr.... E' tanto che non uso ASP ;)

SteR9
22-02-2004, 10:41
Originariamente inviato da cionci
Ci dovrebbe essere la funzione instr.... E' tanto che non uso ASP ;)
ok perfetto allora è come immaginavo...
un'ultima cosa...come posso fare per fare una ricerca su tutte le pagine?come faccio a passargli tutte le pagine qua
Set tf = fso.CreateTextFile("c:\testfile.txt", True) ?

cionci
22-02-2004, 10:48
OpenTextFile ;)

Devi leggerti la struttura delle directory sempre con FileSystemObject...

http://msdn.microsoft.com/library/en-us/script56/html/sgWorkingWithDrives.asp?frame=true

SteR9
22-02-2004, 21:02
allora ho provato questo esempio

Dim objOpenFile, objFSO, strPath, strText
strPath = server.MapPath("ciao.txt")
set ObjFSO = server.CreateObject("Scripting.FileSystemObject")
set ObjOpenFile = objFSO.OpenTextFile(strpath, ForReading)
DO while not objopenFile.AtEndOfStream
strText = objOpenFile.ReadLine
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
loop
objOpenFile.close
set objOpenFile = nothing
set ObjFSO = nothing


ma rimane ferma la barra di caricamento della pagina ma non la carica....eppure l'esempio dovrebbe essere giusto...cosa potrebbe essere?

SteR9
23-02-2004, 12:41
Uppettino :)

SteR9
23-02-2004, 16:19
provandolo sul server dove ho lo spazio web mi da questo errore

Microsoft VBScript runtime error '800a0005'

Invalid procedure call or argument

leggifile.asp, line 13

la linea 13 è questa
set ObjOpenFile = objFSO.OpenTextFile(strPath,ForReading)

cosa potrebbe essere?

cionci
23-02-2004, 16:34
Boh...sinceramente non capisco dove sia il problema...
Forse chi ospita le tue spazie non permette di creare l'oggetto... Boh...

SteR9
23-02-2004, 16:43
Originariamente inviato da cionci
Boh...sinceramente non capisco dove sia il problema...
Forse chi ospita le tue spazie non permette di creare l'oggetto... Boh...
anche io avevo pensato a questo eppure nn va nemmeno in locale...ma la sintassi è giusta...boh :cry:

cionci
23-02-2004, 16:55
Il problema era che mancavano le definizioni delle costanti:

<%
Dim objOpenFile, objFSO, strPath, strText
Const ForReading = 1, ForWriting = 2, ForAppending = 8
strPath = server.MapPath("/ciao.txt")
set ObjFSO = server.CreateObject("Scripting.FileSystemObject")
set ObjOpenFile = objFSO.OpenTextFile(strPath, ForReading, True)
DO while not objopenFile.AtEndOfStream
strText = objOpenFile.ReadLine
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
loop
objOpenFile.close
set objOpenFile = nothing
set ObjFSO = nothing
%>

SteR9
23-02-2004, 17:27
Originariamente inviato da cionci
Il problema era che mancavano le definizioni delle costanti:

<%
Dim objOpenFile, objFSO, strPath, strText
Const ForReading = 1, ForWriting = 2, ForAppending = 8
strPath = server.MapPath("/ciao.txt")
set ObjFSO = server.CreateObject("Scripting.FileSystemObject")
set ObjOpenFile = objFSO.OpenTextFile(strPath, ForReading, True)
DO while not objopenFile.AtEndOfStream
strText = objOpenFile.ReadLine
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
loop
objOpenFile.close
set objOpenFile = nothing
set ObjFSO = nothing
%>

non va ancora :(

ho provato questo

Dim FileObject
Set FileObject=Server.CreateObject("Scripting.FileSystemObject")

'LEGGO IL FILE
Set InStream=FileObject.OpenTextFile(Server.MapPath("dalegg.asp"),1,False,False)
linee=Instream.ReadAll
InStream.Close
Set InStream=Nothing

'MOSTRO A VIDEO IL CONTENUTO DEL FILE
Response.write "<pre>" & linee & "</pre>"

Set FileObject=Nothing

e sullo spazio web funziona ma in locale continua a non funzionare...potrebbe essere qualche impostazione di iis?

SteR9
23-02-2004, 17:29
edit mi ero sbagliato,nn va! d'oh :muro: :muro:

cionci
23-02-2004, 17:34
Prova a togliere lo / dal nome del file da quello che ti ho passato io... A me funziona benissimo...

SteR9
23-02-2004, 17:52
niente,non ne vuole sapere di andare...sarà un problema in iis...boh... :muro:

cionci
23-02-2004, 17:53
Ma che errore ti da ora ?

SteR9
23-02-2004, 18:09
Originariamente inviato da cionci
Ma che errore ti da ora ?
è questo il bello!
non mi da nessun errore....continua a rimanere a metà la barra di caricamento della pagina e non la carica...un pò come se fosse in un ciclio infinito che nn gli permette di finire il caricamento della pagina...

SteR9
23-02-2004, 19:30
risolto....era colpa del maledetto blocco degli script del norton anti virus! :muro:
ciao :)

SteR9
23-02-2004, 21:33
hoprovato a scrivere la pagina per la ricerca in tutti i files...ma non funziona...la pagina è questa

<%
Dim objFSO,objFile,objFolder,strText,Testo
testo = "prova"
set objFSO = server.CreateObject("Scripting.FileSystemObject")
set objFolder = objFSO.GetFolder("c:\inetpub\wwwroot\")

for each objfile in objfolder.Files
set ObjOpenFile = objFSO.OpenTextFile(objfile.name, ForReading, True)
strText = objOpenFile.ReadLine
if Instr(strtext, testo) <> 0 then
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
end if
next
set objFolder = nothing
set objFSO = nothing
%>

mi da questo errore
Errore di run-time di Microsoft VBScript (0x800A0005)
Chiamata di routine o argomento non validi
su questa riga set ObjOpenFile = objFSO.OpenTextFile(objfile.name, ForReading, True)
dove sbaglio?
grazie

SteR9
24-02-2004, 15:51
ho corretto mi ero dimenticato alcune cose...
ora il codice è questo

Dim objFSO,objFile,objFolder,strText,Testo,ObjOpenFile
testo = "prova"
set objFSO = server.CreateObject("Scripting.FileSystemObject")
set objFolder = objFSO.GetFolder("c:\inetpub\wwwroot\")

for each objfile in objfolder.Files
set ObjOpenFile = ObjFSO.OpenTextFile(Server.MapPath(objfile.name),1,False,False)
response.Write(objfile.name & "<BR>")
strText = objOpenFile.ReadLine
if Instr(strtext, testo) <> 0 then
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
end if
next
set objFolder = nothing
set objFSO = nothing

ma mi da questo errore
Errore di run-time di Microsoft VBScript (0x800A003E)
Input oltre la fine del file
dove potrebbe essere il problema?

SteR9
24-02-2004, 16:04
Originariamente inviato da SteR9
ho corretto mi ero dimenticato alcune cose...
ora il codice è questo

Dim objFSO,objFile,objFolder,strText,Testo,ObjOpenFile
testo = "prova"
set objFSO = server.CreateObject("Scripting.FileSystemObject")
set objFolder = objFSO.GetFolder("c:\inetpub\wwwroot\motore")
strpath = "c:\inetpub\wwwroot\motore\"
for each objfile in objfolder.Files
set ObjOpenFile = ObjFSO.OpenTextFile(strpath&objfile.name,1,False,False)
response.Write(strpath&objfile.name & "<BR>")
strText = objOpenFile.ReadLine
response.Write(strText& "<BR>")
if Instr(strtext, testo) <> 0 then
response.Write(server.HTMLEncode(strtext))
response.Write("<BR>")
end if
next
set objFolder = nothing
set objFSO = nothing

ora va tutto ma sembra non funzionare readline perchè la var strtext non prende alcun valore...
dove potrebbe essere il problema?

cionci
24-02-2004, 17:33
Frvi emttere il controllo sull'endofstream...

SteR9
24-02-2004, 17:41
Originariamente inviato da cionci
Frvi emttere il controllo sull'endofstream...
sbagliavo con quell'if...ora funziona tutto...però ho un'altra domanda...
if Instr(strtext, testo) <> 0 then
response.Write("<a href="&objfile.name &">" & "testo</a>" & strtext)
response.Write("<BR>")
end if

ora in questo modo stampo tutte le pagine che contengono la parola cercata...se volessi stampare solo un pezzettino della variabile strText,la parte di testo in cui è contenuta la parola cercata...come dovrei fare?

SteR9
25-02-2004, 15:33
ok sono riuscito ad estrarre la parte di testo che mi interessa...però andando a cercare dentro al file mi stampa anche i tag html e ad esempio le animazioni flash...nn c'è un modo per impedirgli di farlo?

cionci
26-02-2004, 00:13
Prov così:

Response.Write Server.HTMLEncode( string )

SteR9
26-02-2004, 10:11
Originariamente inviato da cionci
Prov così:

Response.Write Server.HTMLEncode( string )
eh ma così mi stampa proprio i tag...invece io vorrei ad esempio una funzione che salti il contenuto dei tag....nn si potrebbe scrivere una funzione del genere? che quando trova <testo html>
lo salta...

cionci
26-02-2004, 17:16
Dim OpenTag
OpenTag = 0
Function HTMLStrip(StrToStrip, ByRef OpenedTag)
Dim gt, ls, tmp;
ls = 0
gt = 0
Do
If OpenTag = 0 Then
ls = InStr(gt+1, StrToStrip, "<")
If ls > 0 Then
OpenedTag = 1
End If
End If
gt = InStr(ls+1, StrToStrip, ">")
If OpenTag <> 0 And ls = 0 And gt = 0 Then
StrToStrip = ""
ElseIf ls = 0 And gt <> 0 Then
StrToStrip = Right(StrToStrip, gt)
gt = 0
ElseIf ls <> 0 And gt = 0 Then
StrToStrip =
ls = 0
Else
StrToStrip = Left(StrToStrip, ls) & Right(StrToStrip, Len(StrToStrip)-gt)
ls = ls - 1
gt = ls
End If
Loop While ls <> 0 And gt <> 0
End Function

Prova con qualcosa del genere....
Ovviamente OpenTag lo devi ripresentare ad ogni riga che fai controllare...

SteR9
26-02-2004, 18:00
l'ho provato ma non mi sono chiare alcune cose

Dim OpenTag
OpenTag = 0
response.Write(HTMLStrip("<strong>ciao mondo!</strong>",0))
Function HTMLStrip(StrToStrip, ByRef OpenedTag)
Dim gt, ls, tmp
ls = 0
gt = 0
Do
If OpenTag = 0 Then
ls = InStr(gt+1, StrToStrip, "<")
If ls > 0 Then
OpenedTag = 1
End If
End If
gt = InStr(ls+1, StrToStrip, ">")
If OpenTag <> 0 And ls = 0 And gt = 0 Then
StrToStrip = ""
ElseIf ls = 0 And gt <> 0 Then
StrToStrip = Right(StrToStrip, gt)
gt = 0
ElseIf ls <> 0 And gt = 0 Then
'StrToStrip =
ls = 0
Else
StrToStrip = Left(StrToStrip, ls) & Right(StrToStrip, Len(StrToStrip)-gt)
ls = ls - 1
gt = ls
End If
Loop While ls <> 0 And gt <> 0
End Function

allora qua
ElseIf ls <> 0 And gt = 0 Then
StrToStrip =
ls = 0
manca l'assegnamento a strToStrip.

poi non capisco cosa sono opentag e OpenedTag...
grazie mille!:)

cionci
26-02-2004, 18:20
Sono la stessa cosa, chiamali OpenedTag.... Indica (e il valore riotrna anche al chiamante) che c'è un tag rimasto aperto da unachiamata precedente (visto che un tago potrebbe venire chiuso anche nella riga successiva)...

Non l'ho provata... è per quello che ci sono tanti errori ;)


Dim OpenedTag
OpenedTag = 0
response.Write(HTMLStrip("<strong>ciao mondo!</strong>",OpenedTag))
Function HTMLStrip(StrToStrip, ByRef OpenedTag)
Dim gt, ls, tmp
ls = 0
gt = 0
Do
If OpenTag = 0 Then
ls = InStr(gt+1, StrToStrip, "<")
If ls > 0 Then
OpenedTag = 1
End If
End If
gt = InStr(ls+1, StrToStrip, ">")
If gt > 0 Then
OpenedTag = 0
End If
If OpenedTag <> 0 And ls = 0 And gt = 0 Then
StrToStrip = ""
ElseIf OpenedTag <> 0 And ls = 0 And gt <> 0 Then
StrToStrip = Right(StrToStrip, gt)
gt = 0
ElseIf ls <> 0 And gt = 0 Then
StrToStrip = Left(StrToStrip, ls)
ls = 0
Else
StrToStrip = Left(StrToStrip, ls) & Right(StrToStrip, Len(StrToStrip)-gt)
ls = ls - 1
gt = ls
End If
Loop While ls <> 0 And gt <> 0
End Function

SteR9
26-02-2004, 19:08
non stampa niente :cry: ho provato a stampare ogni StrToStrip
dentro a ogni else ma sembra che vengano cancellati... boh :confused:

sembra nn funzionare questo
StrToStrip = Left(StrToStrip, ls) & Right(StrToStrip, Len(StrToStrip)-gt)

SteR9
28-02-2004, 09:24
cionci mi hai abbandonato??:cry: :cry:
ho provato a fare un pò di prove ma nn funziona qua
StrToStrip = Left(StrToStrip, ls) & Right(StrToStrip, Len(StrToStrip)-gt)

però non riesco a trovare un'altro modo per farlo :muro: :muro:

cionci
28-02-2004, 09:33
Sto lavorando...ora non ho tempo :(

SteR9
28-02-2004, 10:07
Originariamente inviato da cionci
Sto lavorando...ora non ho tempo :(
ok,non ti preoccupare...quando hai un pò di tempo se puoi darci un'occhiata! grazie ancora!:)