Fazendo ordem usando o algoritmo de distância de Winkler?
-
27-09-2019 - |
Pergunta
Estou me perguntando como seria capaz de executar uma ordem sqlite dessa maneira
select * from contacts order by jarowinkler(contacts.name,'john smith');
Eu sei que o Android tem um gargalo com funções definidas pelo usuário, eu tenho uma alternativa?
Solução
Etapa 1: faça a consulta menos o ORDER BY
parte
Etapa 2: Crie um CursorWrapper
Isso envolve o seu Cursor
, calcula a distância de Winkler Jaro para cada posição, classifica as posições e depois usa as posições classificadas ao substituir todos os métodos que requerem uma posição (por exemplo, moveToPosition()
, moveToNext()
).
Outras dicas
Pré -calcule comprimentos de string e adicione -os em coluna separada. Em seguida, classifique a tabela integrada por esse comprimento. Adicione índices (se puder). Em seguida, adicione filtros extras, por exemplo, você não deseja comparar "Srivastava Brahmaputra" com "John Smith". O comprimento está fora de loucura demais, então exclua esse tipo de comparação por comprimento como uma porcentagem do comprimento total. Portanto, se sua palavra for 10 caracteres, compare-a apenas com palavras com 4+-2 ou 10+-3 caracteres.
Dessa forma, você reduzirá significativamente o número de vezes que esse algoritmo precisa ser executado.
Normalmente, no vocalbular de 100.000 entradas, esses filtros reduzem o número de comparações para cerca de 300. A menos que você esteja fazendo uma ligação completa de registro e então eu me pergunto por que usar o Android para isso. Você ainda precisaria aplicar métodos probabilísticos para isso e calcular as pontuações e isso não é um trabalho para o Android (pelo menos não por enquanto).
Também no MS SQL Server Jaro Winkler String Distância envolvida na função CLR tem um desempenho muito melhor, já que o SQL Server não supra nativamente e grande parte do processamento está em torno de matrizes. Portanto, a implementação no T-SQL adiciona muita sobrecarga, mas o SQL-CLR funciona extremamente rápido.