Делать заказ, используя алгоритм расстояния Jaro-Winkler?

StackOverflow https://stackoverflow.com/questions/2847603

Вопрос

Мне интересно, как бы я смогу запустить порядок SQLite по этому способу

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

Я знаю, что Android имеет узкое место с пользовательскими функциями, у меня есть альтернатива?

Это было полезно?

Решение

Шаг № 1: сделать запрос минус ORDER BY часть

Шаг № 2: Создать CursorWrapper Это обернутся Cursor, рассчитывает расстояние Jaro-Winkler для каждой позиции, сортирует позиции, затем использует отсортированные позиции при переопределении всех методов, которые требуют позиции (например, moveToPosition(), moveToNext()).

Другие советы

Предварительно рассчитайте длину строки и добавьте их в отдельную колонку. Затем сортируйте увязшую таблицу той длиной. Добавить индексы (если вы можете). Затем добавьте дополнительные фильтры, например, вы не хотите сравнивать «Srivastava Brahmaputra», чтобы «Джон Смит». Протяженность в том, что длина намного настаивает слишком много, поэтому исключаем подобное сравнение по длине в процентах от общей длины. Поэтому, если ваше слово 10 символов сравнивает это только словами с 10 + -2 или 10 + -3 символами.

Таким образом, вы значительно снизите количество раз, когда этот алгоритм должен работать.

Как правило, в сосласении 100 000 записей такие фильтры уменьшают количество сравнений до 300 лет. Если вы не выполняете полную выдувную связь, а затем я задаюсь вопросом, зачем использовать Android для этого. Вам все равно нужно применить вероятностные методы для этого и рассчитать оценки, и это не работа для Android (по крайней мере, не сейчас).

Также в MS SQL Server Server Daro Winkler String Distance, завернутый в функцию CLR, намного лучше, поскольку SQL Server не включает в себя Arays, а также большую часть обработки вокруг массивов. Таким образом, реализация в T-SQL добавляет слишком много накладных расходов, но SQL-CLR работает очень быстро.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top