Делать заказ, используя алгоритм расстояния Jaro-Winkler?
-
27-09-2019 - |
Вопрос
Мне интересно, как бы я смогу запустить порядок 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 работает очень быстро.