Ricerca all'interno del database

venerdì 09 maggio 2014 - 12.29
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server 2008 R2  |  Firefox

uruse1980 Profilo | Newbie

Ho una listview bindata ad un sqldatasource chiamato "DSricerca" collegato ai dati con la query SELECT che vedete nel commento all'interno del codice. Quando si scatena l'evento SELECTING vorrei estrarre soltato i record che contengano nel campo TITOLO oppure (OR) nel campo DESCRIZIONE almeno una o tutte le parole contenute in una textbox chiamata "txtcerca". Insomma, un piccolo motore di ricerca sul db. Ecco il codice (troncato all'essenziale):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Funziona perfettamente se nella textbox "txtcerca" c'e' una sola parola.
Problema:
se in txtcerca inserisco piu' parole, lui cerchera' nel db la "sequenza esatta di parole", e non (giustamente) la presenza di una o piu' di esse! Come poter farglielo fare? Pensavo di concatenare tanti "like" quante sono le parole cercate, ma questo metodo non è attaccabile da sql injection? Quali altre possbili soluzioni? Grazie!

alx_81 Profilo | Guru

Ciao

>Funziona perfettamente se nella textbox "txtcerca" c'e' una sola parola.
>Pensavo di concatenare tanti "like" quante sono le parole cercate, ma questo
>metodo non è attaccabile da sql injection? Quali altre possbili
>soluzioni?
diciamo che la like non è il top per fare un motore di ricerca.. quando i dati aumenteranno avrai non pochi rallentamenti, perchè la LIKE fatta sul CONTAINS (non a destra o sinistra) costa di uno scan di tutto il resultset o dell'indice scritto per la situazione.
Se vuoi fare operazioni di questo tipo forse il Full-Text oppure database disegnati proprio per ricerche velocissime sono meglio..
Resta il fatto che se la vuoi fare semplice, potresti provare a mettere il % per ogni spazio che trovi.. ma la ricerca sarebbe un po' fuori controllo..
Poi ci sono algoritmi di prossimità, ma siamo sempre nello stesso problema, il database relazionale non è fatto per fungere da motore di ricerca performante. Almeno non con questo tipo di ricerca, per questo sono stati aggiunti i servizi d Full-Text appunto. Se vuoi approfondire, leggi qui: http://technet.microsoft.com/it-it/library/ms142571.aspx

>Grazie!
di nulla!
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

uruse1980 Profilo | Newbie

Intanto grazie mille per la tua risposta. Stavo valutando la ricerca full-text qualche giorno fa, quando mi sono imbattuto nel "queryextender" di visualstudio. Ho seguito una piccola guida su youtube sull'utilizzo, e l'ho implementato.
La prima impressione è stata: "Mio Dio, ma questo controllo è mostruoso!"
Adesso che pero' leggo (da te) la questione della lentezza del "contains" mi viene qualche dubbio, in effetti io ho il sito in fase di progettazione e quindi nel db ho qualche manciata di record (7-8) inventati.
Ora creo una pagina che mi filli il database di almeno 100.000 record e verifico il comportamento, anche se non potro' mai vederlo in multiutenza se non prima di pubblicarlo :-(

Riguardo ai queryextender bindati con LINQdatasource (come ho fatto io) conosci qualcosa? Sai indicarmi se ho fatto la scelta giusta? Insomma, se sai qualcosa piu' di me...sono tutto orecchie! :-)

Grazie!

alx_81 Profilo | Guru

>Ora creo una pagina che mi filli il database di almeno 100.000
>record e verifico il comportamento, anche se non potro' mai vederlo
>in multiutenza se non prima di pubblicarlo :-(
non riesci a fare dei Load Test? quelli ti generano pure le utenze e gli accessi..

>Riguardo ai queryextender bindati con LINQdatasource (come ho
>fatto io) conosci qualcosa? Sai indicarmi se ho fatto la scelta
>giusta? Insomma, se sai qualcosa piu' di me...sono tutto orecchie!
Purtroppo non lo conosco.. ma alla fine è sempre SQL che viene generato. Quindi, se fai delle contains, prima o poi qualche degrado ce l'avrai.
O comunque, anche se verranno create cache, se i dati aumentano sul serio, potresti avere bisogno di molta memoria..
L'unica è testarlo con del carico veramente. Non conosco le sue performance, ma di solito, quando le cose diventano grandi (soprattutto in ambito enterprise), si cerca di muoversi verso strumenti fatti più apposta infrastrutturalmente proprio..

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

uruse1980 Profilo | Newbie

Load Test??? Sono tutto orecchie se vuoi raccontarmi qualcosa! Non li conosco!

A proposito....ti lascio il video che in qualche minuto ti insegna ad usare il dataset linq collegato ai queryextender!
E' veramente banale usarli!, verso meta' video (quindi dopo circa 6 minuti) hai gia' fatto tutto! :-)

https://www.youtube.com/watch?v=gjOXWfwpEEk

alx_81 Profilo | Guru

>Load Test??? Sono tutto orecchie se vuoi raccontarmi qualcosa!
>Non li conosco!
parti da qui: http://msdn.microsoft.com/en-us/library/dn250793.aspx

grazie per il link!
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

uruse1980 Profilo | Newbie

Figuarti! Senti, vorrei valutare la ricerca full-text.
Io uso VisualStudio 2010 ultimate installazione "full." Quando vado in "apri definizione tabella..." e poi sul menu in alto "progettazione tabelle", la voce "indice full-text" c'è ma è disabilitata (grigia)
Ho cercato guide per mari e monti, mi fa male la testa. Perchè è disabilitata? Come posso abilitarla? Grazie!

alx_81 Profilo | Guru

>Figuarti! Senti, vorrei valutare la ricerca full-text.
>Io uso VisualStudio 2010 ultimate installazione "full." Quando
>vado in "apri definizione tabella..." e poi sul menu in alto
>"progettazione tabelle", la voce "indice full-text" c'è ma è
>disabilitata (grigia)
>Ho cercato guide per mari e monti, mi fa male la testa. Perchè
>è disabilitata? Come posso abilitarla? Grazie!
Sull'opzione in Visual Studio 2010 purtroppo non so aiutarti..
mi spiace

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5