(04-04-2022, 21:11)gambafeliz escribió: He estado pensando sobre FTS5 y tras como me lo cuentas, he pensado que es poco practico. ¿estoy equivocado?, ¿ves realmente un ejemplo donde es practico?
Te lo digo por que mantener las tablas y mantener una tabla virtual para obtener datos ambiguos como "Clinica" y Clínica" no se si compensa este método. Diría que se puede contar con los dedos de la mano quien lo usa en real a nivel incluso mundial. No se yo. ¿En fin que opinas al respecto?
Otra cosa me ha gustado tu código, gracias, ya que viendo código real de unos y de otros, me enriqueces muchísimo técnicamente. Incluso he visto algo en tu código que pensaba que Gambas ni lo hacia, tengo que probarlo, pero si funciona, sigo diciendo que Gambas es maravilloso. Gracias.
Buenos días!
Si que se ha desanimado pronto, hombre de poca fe!. En mi mensaje le decía "cosillas" a tener en cuenta. Le matizo lo que dije:
Siempre hay que tener en cuenta la naturaleza de los datos que manejamos, de ahí que puede ser necesario recargar las tablas FTS5 con más o menos frecuencia, pero será raro que estas tengan un gran volumen de datos. En el caso más extremo, utilice una base de datos SQLite en memoria, al abrir el formulario de búsqueda cree la tabla FTS5 en ella y hace la carga, al cerrar la conexión se borra la base de datos en memoria. Yo al abrir las bases de datos SQLite añado la siguiente linea:
Código:
With modDB.hConn
If Not .Opened Then .Open()
'Attach memory database
.Exec("ATTACH DATABASE ':memory:' AS 'mem'")
End With
Ya tiene usted una nueva base de datos lista para funcionar, en la misma conexión. La que reside en fichero es "main", la que reside en memoria "mem", si una tabla existe en ambos esquemas, y no especifica cual quiere usar, Gambas siempre leerá de "main". De hecho ni siquiera aparece en
Connection.Databases, y tampoco
Connection tiene un método para hacer el "attach".
Para crear la tabla FTS5 en memoria:
[code]
Crear una tabla y cargarle 5.000 registros tarda milisegundos. Si cierra la conexión desaparece. Ya no tiene problemas.
Para que vea un caso práctico le subo una variante de la demo, usa una base de datos en memoria solamente, y algún otro cambio.
Si se fija arriba a la derecha verá que la base de datos es ":memory:", el programa no usa base de datos en disco. Y en el log puede ver varias cosas:
- Cargar los datos del CSV a SQLite ahora tarda 6 segundos en vez de 15 minutos, aunque tiene truco.
- La tabla FTS5 solo tiene dos campos, un ID que no indexa y un campo Dirección. Eso es porque el proceso de carga no separa las columnas del CSV, carga toda la linea en un solo campo (ahí está el truco). El proceso de separar las columnas lo realiza el GridView. Quería comprobar que FTS5 arroja los mismos resultados teniendo 4 campos o toda la información en uno solo.
También hay un nuevo botón, "Refresh". Borra los datos de búsqueda y vuelve a cargarlos, En total un poco más de un segundo para 100.000 registros, eso hace factible refrescar la tabla de búsqueda cada vez que abre el Form. Para probar esta versión solo tiene que copiar el fichero CSV del ejemplo anterior al directorio de esta, no hace falta la base de datos.
Para terminar, creo que este tipo de búsquedas cubre una necesidad específica y lo hace bien, a mí me es muy útil. Sobre si tiene uso y quién lo usa haga una cosa, coja su teléfono móvil, abra Whatsapp y pulse en la lupa de arriba, es la búsqueda. Teclee algo común en las conversaciones, como "hola" o "buenos días" y observe el resultado. Teniendo en cuenta que Whatsapp usa Sqlite yo juraría que si no es FTS5 lo han clonado. Teniendo en cuenta el número de usuarios de esa aplicación, va a resultar que FTS5 de Sqlite es la herramienta Full-Text Search para bases de datos más utilizada del mundo.
Ya me contará que hago en mi código que usted pensaba que no se podía hacer, me ha dejado intrigado.
Un saludo.