Pregunta

Me pregunto cómo iba a ser capaz de ejecutar una orden de SQLite de esta manera

select * from contacts order by jarowinkler(contacts.name,'john smith');

Sé que Android tiene un cuello de botella con funciones definidas por el usuario, qué tengo una alternativa?

¿Fue útil?

Solución

Paso # 1: No hacer la consulta menos la porción ORDER BY

Paso # 2: Crear un CursorWrapper que envuelve su Cursor, calcula la distancia Jaro-Winkler para cada posición, ordena las posiciones, a continuación, utiliza las posiciones ordenados cuando anulando todos los métodos que requieren una posición (por ejemplo, moveToPosition(), moveToNext()).

Otros consejos

Pre calcular longitudes de cuerda y les agregan a la columna separada. A continuación, ordenar entired tabla que esa longitud. Añadir índices (si es posible). A continuación, añadir filtros adicionales, por ejemplo, que no desea comparar "Srivastava Brahmaputra" a "John Smith". La longitud están fuera de Wack por demasiado por lo que excluye este tipo de comparación por longitud como un porcentaje de la longitud total. Así que si su palabra es 10 caracteres se comparan sólo a las palabras con 10 + 10 + -2 o -3 caracteres.

De esta manera se reducirá de manera significativa el número de veces que este algoritmo necesita para funcionar.

Por lo general en el vocalbulary de 100 000 entradas tales filtros reducen el número de comparaciones a aproximadamente 300. A menos que usted está haciendo una vinculación registro completo soplado y entonces se preguntaría por qué el uso de Android para eso. A pesar de ello es necesario aplicar métodos probabilísticos para que calcule y anota y esto no es un trabajo para Android (al menos no por ahora).

También en MS SQL Server Jaro Winkler distancia cadena envuelto en función CLR se desempeñan mucho mejor, ya que SQL Server no supprt Arays forma nativa y gran parte del procesamiento es de alrededor de matrices. Así aplicación en T-SQL añadir demasiada sobrecarga, pero SQL-CLR funciona extremadamente rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top