¿Cómo implementar la búsqueda difusa con FTS3 de SQLite?
Ya he integrado la búsqueda basada en la documentación oficial de Android y estoy utilizando el siguiente esquema y consulta SQLite:
CREATE VIRTUAL TABLE Search USING FTS3 ( _id, name, location ); select * from Search where name MATCH ? -- where ? is the user typed exact "query" -- or if it doesn't have spaces or stars I append a star to search prefix: "query*"
Me pregunto cómo puedo extenderlo? Para permitir lo siguiente:
- Acercamiento a las imágenes de Android en DB
- ¿Podemos usar Guid como clave principal en la base de datos de SQL Server?
- SQLite SUM y LIMIT no parecen funcionar juntos
- Sincronización local de SQLite con Firebase
- Empaquetado DB de SQLite con mi aplicación
Digamos que tengo algunos elementos llamados:
- Mi artículo de fantasía
- Mi artículo secreto
- Artículo 1
- Su artículo de fantasía
Cuando el usuario escribe " blah
en el cuadro de búsqueda, los resultados de la búsqueda mostrarán:
-
my
- Mi artículo de fantasía
- Mi artículo secreto
-
mfi
- Mi feanidad
-
fan item
,fanit
,fit
- Mi fan cy
- Tu fan cy lo
-
it
,item
,im
,itm
- Mi fantasía m
- Mi secreto m
- Yo soy m # 1
- Tu fantasía m
Los resultados deben ser clasificados en función de lo bueno que es el partido, por ejemplo, si las letras están más lejos deben clasificar más bajo que una coincidencia exacta, como para mfi
: "Mi elemento de fantasía" debe clasificar por último y "MFI thingy" debe clasificar primero (Si había tal artículo).
Nota: mi min SDK es API nivel 10, lo que significa que tiene que trabajar con SQLite 3.6.22 .
Funcionalidad similar se puede encontrar principalmente en IDEs:
- Eclipse: Tipo abierto y recurso abierto
- IntelliJ IDEA Navegar a *
- Sublime Text Ir a cualquier cosa
- Multiple OrderBy en el método SQLiteDatabase.Query
- Android 6.0 y superiores no se borran los datos de sqlite del teléfono después de desinstalar la aplicación
- ¿Cómo recuperar un ID del elemento seleccionado en un Spinner dinámico?
- Mostrar datos SQLite en RecyclerView
- ¿Por qué algunos métodos SQLite esperan argumentos como un objeto , mientras que otros necesitan una cadena ?
- Cómo almacenar datetime en SQLite
- Examinar la base de datos SQLite de mi aplicación para Android?
- Calcular la distancia entre dos puntos directamente en SQLite
El FTS de SQLite permite buscar sólo palabras enteras o prefijos de palabras.
No hay funcionalidad incorporada para búsquedas difusas como esta. (Y la API de base de datos de Android no le permite agregar implementaciones de tabla virtual personalizadas.)
Fui con relajante mis criterios para buscar todos los comienzos palabra:
private static String fixQuery(String query) { return query.trim().replaceAll("\\s+", "*") + "*"; }
Funciona bastante bien. No typo-resistente, pero se siente natural cuando lo estoy usando.
- Crear widget en la instalación de la aplicación
- ¿Cómo se pueden manejar múltiples solicitudes para llenar modelos con RXJava Observables?