View Full Version : [SQL + ASP] Ricerca caratteri accentati
SerMagnus
03-11-2009, 11:52
Ciao raga,
ormai sono un paio di giorni che sbatto la testa contro questo problema senza giungere ad una soluzione :muro:
In pratica ho la necessità di effettuare delel query SQL per ricercare dei testi, con la possibilità però di effettuare ricerche anche per testo contententi caratteri accentati
Esempio
se ricerco la parola "cioe" => devo avere come risultati tutti i testi contenenti => "cioè" "cioé" "cioe"
Ho il cervello in pappa... sarà che sono mezzo influenzato, ma davvero nn ci arrivo.
Vi ringrazio, ciao!
scusa la domanda che magari può sembrare stupida, ma tra i possibili risultati dovrebbero essere comprese anche eventualu parole (errori di battitura, ok) come "cìoe", "cìoè" e "cìoé"?? (notare la i accentata)
e magari anche le lettere apostrofate (che solitamente usano gli utenti con tastiera inglese) in sostituzione di quelle accentate?
un'altra domanda, tutto questo lo vuoi fare utilizzando semplicemente l'SQL perchè magari scrivi le query a mano oppure ti va bene anche il PHP o altri linguaggi di programmazione per generare le query?
SerMagnus
03-11-2009, 12:24
ciao kurts grazie dell'interessamento
per la prima domanda la risposta è SI, il senso è che lo scopo è appunto trovare anche i risultati della ricerca includendo tutte le variazioni accentante del testo. è come se mi servisse una normalizzazione del testo all'inverso, lo so è una richiesta strana in cui non mi sono mai imbattuto.
per l'altra domanda, attualmetne sto sviluppando in ASP, quindi sto pure con DB ACCESS (non ditemi nulla :rolleyes:), ma pensavo si potesse risolvere solo con query SQL,
cmq modificare le query nn è un problema, il punto è capire il come perchè sincermamente non so proprio da dove partire per venire a capo di questo problema
attualmente mi sono fermato alla classica ...LIKE '%termini%' :mc:
quello che secondo me devi fare, e qui dovrai aspettare qualcuno che conosca l'ASP, è crearti una bella funzioncina che esamini la parola in input e ti generi n varianti della stessa che poi verranno usate per generare la query SQL che ti interessa (o anche più di una)
sempre parlando teoricamente, come dovrebbe essere questa funzione?
io direi che possiamo sistetizzarla così:
1-prende la parola in input
2-analizza la prima lettera (o la prossima)
3-IF trova una vocale allora genera le varie "mutazioni" (magari le metti in un array)
4-IF la parola NON è finita allora torniamo al punto 2
5-ELSE aggiungiamo all'array anche la parola originale
6-ti esamini passo-passo il contenuto dell'array e generi le tue n query
chiaramente il puntio 6 può essere modificato per fare in modo che la query generata sia una sola del tipo: cioè OR cioe OR cìoe OR ecc...
la parte LIKE '%termini%' va bene però potrebbe restituire molte volte la stessa frase nel caso in cui siano contenute più di una parola tra quelle cercate
SerMagnus
03-11-2009, 12:47
wao grazie mille!
provo e ti faccio sapere :D
parecchio tempo fa ho avuto il tuo stesso problema.....
semplicemente mi sono creato un metodino che data una string tornava un array con tutte le varianti. es
string a = "ciao";
string[] b = analizza(a);
selectCmd = "Select into ddd where ";
foreach(string caso in b)
{
selectCmd += "campo Like '"+caso+"' OR ";
}
selectCmd = selectCmd.substring(0,selectCmd.Lenght -3);
....................
private string[] analizza(string daAnalizzare)
{
List<String> risultato = new List<String>();
risultato.add(daAnalizzare);
risultato.add(daAnalizzare.Replace('a','à'));
risultato.add(daAnalizzare.Replace('o','ò'));
.................
return risultato.ToArray();
}
SerMagnus
04-11-2009, 10:38
grazie mille sneeze, ieri nn ho avuto molto tempo per provare, ma oggi mi ci metto
grazie a tutti per l'aiuto!
cmq se avete altri consigli gradirei molto, anche perchè home ha fatto notare sneeze magari può servire anche ad altri. ciau!
SerMagnus
04-11-2009, 11:10
mi era venuta la malsana idea di operare in questo modo:
1) faccio un fetch di tutti in dati nel db
2) elaboro ogni riga con una funzione che elimina tutti i caratteri speciali e converte le lettere accentate nelle rispettive versioni non accentate (tipo la funzione analizza si sneeze)
3) salvo tutto in una view temporanea
4) effettu la ricerca nella view
5) salvo i risultati
6) elimino la view
lo so è uno preco di risorse e tempo, però in questo modo posso considerare anche casi più complessi di semplici vocali, tipo le consonanti e altro.
certo sarebbe più facile lavorare con i trigger, ma sto in Classic ASP con DB Access :muro:
che ne dite?
può essere una idea.... purtroppo il vero problema in questi casi è che, a mia conoscenza, non esiste una funzione sql che elimini accenti e lettere speciali altrimenti sarebbe una stupidata fare una select utilizzando tale funzione, un pò come utilizzare un UPPER.
io al mio tempo risolsi con un metodo tipo quello che ho postato, non dubito che il tuo possa anche essere migliore per risultato finale ottenuto, temo però che se i dati che hai sono molti tu possa avere un enorme spreco di risorse e un disastroso calo delle prestazioni, oltretutto essendo il db access e nemmeno un sql server già in quanto a prestazioni non sei messo benissimo....
però un tentativo ne vale la pena, dovesse essere una valida soluzione ti prego di postarla per tutti perchè è un argomento che ricorre spesso
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.