Frage

Ich frage mich, wie würde ich in der Lage sein, eine SQLite zu laufen, um durch die auf diese Weise

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

Ich weiß, dass Android ein Engpass mit benutzerdefinierten Funktionen hat, habe ich eine Alternative?

War es hilfreich?

Lösung

Schritt 1: Führen Sie die Abfrage minus den ORDER BY Teil

Schritt 2: Erstellen Sie eine CursorWrapper, die Ihre Cursor Wraps, berechnet die Jaro-Winkler Abstand für jede Position, sortiert die Positionen, dann die sortierten Positionen verwendet, wenn alle Methoden überschreiben, die eine Position erfordern (zB moveToPosition(), moveToNext()).

Andere Tipps

Pre berechnen Stringlängen und fügen Sie sie in separaten Spalte. Dann sortieren entired Tabelle durch, dass diese Länge. In Indizes (wenn Sie können). Dann fügen Sie zusätzliche Filter zum Beispiel Sie wollen nicht „Srivastava Brahmaputra“ auf „John Smith“ zu vergleichen. Die Länge ist aus wack durch viel zu viel, um diese Art von Vergleich von Länge als Prozentsatz der Gesamtlänge auszuschließen. Also, wenn Ihr Wort 10 Zeichen vergleichen es nur Worte mit 10 + -2 oder -3 10 + Zeichen.

Auf diese Weise kann die Anzahl, wie oft dieser Algorithmus ausgeführt werden muss erheblich reduzieren.

Normalerweise im vocalbulary von 100 000 Einträgen solche Filter die Anzahl der Vergleiche auf etwa 300 reduzieren Sofern Sie ein Blas- Record Linkage tun, und dann würde ich fragen, warum die Verwendung Android dafür. Sie würden immer noch probabilistische Methoden für das und berechnen Partituren und dies ist kein Job für Android (zumindest nicht jetzt) ??anwenden müssen.

Auch in MS SQL Server Jaro Winkler Saitenabstand in CLR-Funktion eingewickelt bessere Leistung viel, da SQL Server nicht supprt arays nativ und viel von der Verarbeitung um Arrays ist. So Implementierung in T-SQL hinzufügen zu viel Aufwand, aber SQL-CLR arbeitet extrem schnell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top