Domanda

Mi chiedo come sarei stato in grado di eseguire un ordine di SQLite per in questo modo

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

So che Android ha un collo di bottiglia con funzioni definite dall'utente, devo un'alternativa?

È stato utile?

Soluzione

Passo # 1: Eseguire la query meno la porzione ORDER BY

Passo # 2: Creare un CursorWrapper che avvolge il tuo Cursor, calcola la distanza Jaro-Winkler per ogni posizione, ordina le posizioni, quindi utilizza le posizioni ordinate quando l'override tutti i metodi che richiedono una posizione (ad esempio, moveToPosition(), moveToNext()).

Altri suggerimenti

Pre Calcolare lunghezze di stringa e aggiungerli in colonna separata. Quindi ordinare entired tabella che tale lunghezza. Aggiungere gli indici (se potete). Quindi aggiungere filtri aggiuntivi per esempio che non si desidera per confrontare "Srivastava Brahmaputra" a "John Smith". La lunghezza è fuori wack titolo troppo quindi esclude questo tipo di confronto per lunghezza come percentuale della lunghezza totale. Quindi, se la tua parola è di 10 caratteri si confronta solo alle parole con 10 + -2 o -3 10 + caratteri.

In questo modo si ridurrà notevolmente il numero di volte che questo algoritmo ha bisogno per funzionare.

In genere nel vocalbulary di 100 000 voci tali filtri riducono il numero di confronti a circa 300. A meno che non si sta facendo una full record linkage soffiato e poi mi chiedo il motivo per cui l'uso di Android per questo. Si avrebbe ancora bisogno di applicare metodi probabilistici per questo e punteggi calcolare e questo non è un lavoro per Android (almeno non per ora).

Anche in MS SQL Server Jaro Winkler distanza stringa avvolto in funzione CLR eseguire molto meglio, poiché SQL Server non supprt Arays nativo e molte delle elaborazioni è intorno array. Così implementazione in T-SQL aggiungere troppo luminosa, ma SQL-CLR funziona estremamente veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top