Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Autocomplete
Forum - C# / VB.NET - Autocomplete

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 17:15
Venerdì, 30/01/2015
Ciao a tutti!
quest'oggi la mia domanda è di prestazione...
per realizzare un autocomplete in ambiente web (asp.net c#) se non volessimo appesantire troppo il database e far aspettare troppo l'utente, avendo come limite strutturale la mole di dati che teoricamente potremmo andare a trovare, come si può fare?
ok, limitare l'estrazione, ma come quantitativo di richieste e mole di dati estratti...che si fa?
in piu, se digito "D" potrei memorizzare in memoria tutti i dati, oppure aspettare alla seconda lettera "DA"..
ma non posso prevedere a priori la mole dati, e ho dubbi su come potrebbe reagire il server sql...e la pagina, in termini di rallentamento all'utente...
chi mi tranquillizza?8-|
(O mi fa perdere il sonno?)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 3:01
Sabato, 31/01/2015
Solitamente si può fare così:

- Quando l'utente comincia a scrivere sulla casella di ricerca, fai partire un timer (con un timeout di circa 500 millisecondi)
- Se l'utente continua a battere, il timer riparte da 500 millisecondi (si resetta)
- Allo scadere del timer, se c'è del testo nella casella, fai una ricerca usando "VALORE%" (dove valore è il contenuto della casella di ricerca). Nota che il % è alla fine. Assicurati di aver creato un indice per il campo che stai usando per la ricerca (così il database può ottimizzare la query).

Questo ovviamente ha delle limitazioni (se l'utente digita "ciao" è c'è un campo chiamato "we ciao we", questo non verrà ritornato nell'auto completamento, mentre "ciao we", si). Ma è semplice da implementare.


Il mio blog: https://piero.dev
PM Quote
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 11:23
Sabato, 31/01/2015
Grazie mille!
Quindi diciamo che limitando la ricerca all'origine.sulla query e affidandomi ad un timer piuttosto che al numero di caratteri dovrei risolvere.
Tutte le mie remore sono dovute al fatto che la ricerca è molto varia e complessa, a livello d'accessibilità potrebbe essere il caso di mettere un menù da cui delimitare la ricerca?
...quindi avere un campo in cui l'utente mi indica se sta cercando una persona, una via, ecc...ecc ?
Alla fine sarebbero 3-4 opzioni
È piu l'aiuto eventualmente offerto da questa scelta oppure non mi conviene?
l'ho individuata come un punto critico, quindi la ricerca è ancora in analisi, su carta ma non su codice
suggerire, alla digitazione di "Dario": "via Dario Dario", "Dario cantante", "Dario scrittore", ecc...ecc... In tempi ottimali, alla Google diciamo (non come loro ovviamente, non esiste il confronto) è quindi sconsigliabile a priori come strada da intraprendere?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:26
Domenica, 01/02/2015
Permettimi di dire che le prestazioni dell'approccio di ricerca sono molto legate alla struttura del DB, quindi la scelta di aggiungere una varibile di ricerca potrebbe rallentare la query o velocizzarla.
Es Il paramento in più mi permette di delimitare la ricerca a una cerchia ristretta di tabelle, allora sicuramente la ricerca sarà più performante.
Il parametro in più rende la ricerca più selettiva, all'ora probabilmente la query richiederà piu tempo per le verifiche sul singolo record rendendo il tutto piu lento.

Queste sono considerazioni molto grossolane non sapendo ne la struttura del tuo DB ne l'implementazione del tuo DB.

PM Quote
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 20:55
Domenica, 01/02/2015
Sono 3-4 tabelle separate, perché la ricerca è "generica" quindi potrei cercare "Dario" o "tavolo" o "Garibaldi" nello stesso campo, e devo suggerire, per esempio, su "Garibaldi":"via Garibaldi", "Garibaldi", "piazza Garibaldi"
...ecco perché ci sto ragionando su...

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:01
Domenica, 01/02/2015
Ok, ma se vuoi un aiuto devi darci qualche informazione in piu, struttura delle tabelle, DB e campi di ricerca, se invece vuoi provare da solo, buonafortuna non è un lavoro impossibile ;)

PM Quote
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 23:05
Domenica, 01/02/2015
Non è tanto"come fare" ma "come fare affinché non vi siano rallentamenti"...
Ho strade, oggetti, nomi di persona e luoghi distribuiti in tabelle diverse su mssql...
Poi le vie sezionate all'interno della tabella (ma penso sia ininfluente, sono dati giàarchiviati, la modifica è sconsigliabile per la mole)
la cosa che penso sia difficile, ma che sinceramente ignoro è il risultato...
Se vado su Google, per esempio, qualsiasi cosa digito...ho praticamente subito un suggerimento o piu di uno...
Vorrei lo stesso risultato o comunque non un cattivo risultato...

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 23:17
Domenica, 01/02/2015
Quello che tu cerchi sta tutto nella scrittura delle query, blocchi non possono esserci, al massimo parte una richiesta a Mysql e questo non fa in tempo a rispondere che gia ne è partita un altra richiesta, qui puoi applicare uno smorzamento come ti ha suggerito Piero, che ti porta ad evitare delle query inutili, ma quando hai bisogno di fare la richiesta al DB la query deve essere impostata a dovere, per garantirti il massimo delle prestazioni.
Per questo ti chiedo la struttura precisa del DB, se no aiutarti a generare queste query risulta impossibile, capisci?

PM Quote
Avatar
darioza (Normal User)
Pro


Messaggi: 104
Iscritto: 06/10/2014

Segnala al moderatore
Postato alle 0:49
Lunedì, 02/02/2015
Ok, quello che mi dici già mi rassicura.
smorzo il carico, elimino le ricerche inutili e ottimizzo la query.
Sono per ogni "categoria" di elementi che si possono cercare una tabella, nel senso che magari ho una tabella con le colonne atte a contenere nome cognome ed età per la persona, nome peso e lotto per l'oggetto e cosi via.
L'unica tabella complessa è quella degli indirizzi, in cui "via Garibaldi, roma" è diviso in 3 campi contenenti: via, Garibaldi, roma.
Non dovrebbe essere complessa, ma abboziamola insieme se ti va, tanto per darmi meglio l'idea di dove potrei errare.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo