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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top