Autore Topic: Ricerca DB tramite FTS3  (Letto 454 volte)

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Ricerca DB tramite FTS3
« il: 25 Febbraio 2015, 11:56:14 CET »
0
Salve a tutti, sto sviluppando una applicazione basata su Database. Ora sono al punto di dover inserire la ricerca. Ho visto che invece che usare una normale ricerca con LIKE sulle mie tabelle esistenti, mi viene consigliato di usare la ricerca FTS3. Cercando informazioni al riguardo, ho visto che per sfruttare tale ricerca devono essere create delle tabelle virtuali. Qui sorgono i miei dubbi: non ho ben capito come dovrebbe essere gestita tutta la questione. Allo stato attuale io ho 3 tabelle, dove in ognuna di esse è presente un campo testo, che deve essere soggetto alla ricerca. Ora la mia domanda è: devo creare delle tabelle virtuali che fanno riferimento alle mie tabelle standard, riempiendole con dei valori duplicati delle tabelle standard? Oppure devo sostituire le mie tabelle standard con le tabelle virtuali create mediante fts3?
Esempio:
Ho la mia prima tabelle che ha un campo testo, la seconda tabella che ha un'altro campo testo (più altri campi non testo) e infine ho la terza tabella con il suo campo testo (più altri campi non testo). Ora ho bisogno di cercare una stringa es: "prova ricerca" su tutti e 3 i campi testo delle 3 tabelle. Cosa faccio, creo appunto 3 tabelle virtuali duplicate delle tabelle standard? Oppure sostituisco le mie tabelle con quelle virtuali in modo da usare fts3 per la ricerca?
Grazie in anticipo, spero di essere stato chiaro in quello che chiedo.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ricerca DB tramite FTS3
« Risposta #1 il: 26 Febbraio 2015, 00:04:09 CET »
0
La documentazione ufficiale spiegata nei dettagli come funziona e cosa fare:
http://www.sqlite.org/fts3.html
Vengono spiegate bene anche i limiti nel utilizzo di queste tabelle, non è possibile sfruttare tutte le funzioni di una tabella standard, ad esempio non è possibile creare ulteriori indici. Puoi provare il funzionamento sul PC con utility ufficiale sqlite3 presente nel SDK di Android o un front end di terze parti. Francamente l'utilizzo di queste funzioni di ricerca di stringhe ottimizzate servono solo se vuoi ridurre i tempi di ricerca con un numero enorme di dati.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:Ricerca DB tramite FTS3
« Risposta #2 il: 26 Febbraio 2015, 08:35:33 CET »
0
La documentazione ufficiale spiegata nei dettagli come funziona e cosa fare:
SQLite FTS3 and FTS4 Extensions
Vengono spiegate bene anche i limiti nel utilizzo di queste tabelle, non è possibile sfruttare tutte le funzioni di una tabella standard, ad esempio non è possibile creare ulteriori indici. Puoi provare il funzionamento sul PC con utility ufficiale sqlite3 presente nel SDK di Android o un front end di terze parti. Francamente l'utilizzo di queste funzioni di ricerca di stringhe ottimizzate servono solo se vuoi ridurre i tempi di ricerca con un numero enorme di dati.

Inviato dal mio Nexus 5 utilizzando Tapatalk

Intanto grazie della risposta...come dicevo però ho cercato prima di aprire il post...ho ovviamente letto la documentazione ufficiale che hai linkato tu, il problema (e molto probabilmente sono io che sono stupido) non sono riuscito a dare una risposta alla mia domanda leggendo quella pagina. In pratica non cpaisco dove venga spiegato quello che io chiedevo. Parla di creare le tabelle virtuali, ma non spiega (almeno io non l'ho trovato) se sostituire le mie tabelle standard con quelle o se devo creare una copia delle mie tabelle reali su quelle virtuali gestendo i vari aggiornamenti, cancellazioni e aggiunte manualmente...
Per il discorso che fai sul fatto che fts3 torna utile su gradi quantitativi di dati si lo so ed hai ragione. Il problema è che non so a priori quanti record verranno creati, molto probabilmente non un numero elevato tanto da dover usare fts3 piuttosto che una normale ricerca LIKE, ma come si suol dire: "meglio prevenire che curare no?"  :D :D :D

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ricerca DB tramite FTS3
« Risposta #3 il: 26 Febbraio 2015, 11:56:42 CET »
0

Non serve quotare l'intero post.

Per capire come funziona basta eseguire i comandi descritti nella documentazione. La tabella virtuale creata per FTS3 elabora i dati presenti nella tabella reale collegata, non è una vera tabella, l'uso della parola virtuale non è scelto a caso. La ricerca attraverso questa tabella virtuale è molto veloce ma perdi alcune funzioni presenti in una tabella reale.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:Ricerca DB tramite FTS3
« Risposta #4 il: 02 Marzo 2015, 09:54:33 CET »
0
...La tabella virtuale creata per FTS3 elabora i dati presenti nella tabella reale collegata, non è una vera tabella, l'uso della parola virtuale non è scelto a caso....

Boh, ho riletto per l'ennesima volta il link, ma io proprio non trovo il passaggio da te riportato...probabilmente sarò tard...
Se per te va bene facciamo un esempio pratico, magari ci arrivo:
Ho 2 tabelle reali composte nella seguente maniera:
Tabella 'libri':
id
nomeLibro (campo di testo)

Tabella 'argomenti':
id
nomeArgomento (campo di testo)
idLibro

Ecco ora cosa dovrei fare? Come faccio a creare 2 tabelle virtuali collegate alle mie tabelle reali? Se mi aiuti a capire questo passaggio te ne sarei davvero grato, grazie ancora.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ricerca DB tramite FTS3
« Risposta #5 il: 03 Marzo 2015, 00:54:52 CET »
+1
Ho capito cosa vuoi fare e credo di essermi spiegato male prima.

La tabella virtuale FTS3 utilizza altre tabelle reali per memorizzare tutta una serie di dati per poter ricercare velocemente delle stringhe, sono visibili se fai un dump del database con delle tabelle virtuali FTS3.

Le tabelle virtuali non sono delle view, i dati devo essere inseriti passando per la tabella stessa. Quindi se hai già un'altra tabella devi prima copiare i dati nella tabella virtuale, ma qui sprechi tempo e spazio sul database oppure tenere i dati sulla tabella virtuale ma ti perdi alcune funzioni SQL di una tabella non virtuale.

Per creare la tabella basta fare un:

Codice (SQL): [Seleziona]
CREATE VIRTUAL TABLE libro USING fts3(nome);
puoi usare questa tabella solo nei modi consentiti dalla documentazione.

Se hai un'altra tabella poi provare a vedere se funziona la copia tra tabelle del solo campo consentito di stringa:

Codice (SQL): [Seleziona]
INSERT INTO libro SELECT nome FROM libro2;
non mi è mai servito e non so se funziona con le tabelle FTS3, altrimenti devi fare la copia via codice con un cursore, comunque consumi spazio e tempo.
adb logcat | tee /tmp/logcat | grep TAG

Offline TheFedex87

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:Ricerca DB tramite FTS3
« Risposta #6 il: 03 Marzo 2015, 08:25:10 CET »
0
Esatto, i miei dubbi nascono proprio da quanto scrivi anche tu stesso...Nel senso, se ogni volta devo copiare il contenuto della tabella reale su quella virtuale ci metto una vita, e tanto vale perdere i vantaggi della ricerca...Il mio dubbio e allora appunto se posso sostituire completamente le mie tabelle reali con quelle virtuali, ho visto che perdo alcune cose, ma potrei anche sorvolare su questo...Boh a sto punto non so davvero che fare...Se sostituire le mie tabelle reali con le virtuali, o seppure effettuare le ricerche tramite LIKE...Copiare ogni volta i dati dalla tabella reale alla virtuale non mi pare il massimo proprio perchè c'è una perdita di tempo e di risorse considerevole...E se aggiornassi entrambe le tabelle contemporaneamente? Nel senso ogni volta che faccio un UPDATE, INSERIMENTO o CANCELLAZIONE dalla tabella reale, faccio la stessa cosa sulla virtuale, in modo da avere sempre la tabella virtuale aggiornata con la reale. Unica cosa se per caso la tabella VIRTUALE che risiede sulla RAM si dovesse corrompere per qualche motivo (vedi crash della applicazione, crash del telefono,...) facendo così non avrei più una tabella virtuale esattamente uguale alla reale...boh non so cosa fare a questo punto!!!