使用Jaro-Winkler距离算法进行排序?

时间:2010-05-17 08:33:59

标签: android sqlite sql-order-by jaro-winkler

我想知道如何以这种方式运行SQLite订单

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

我知道Android存在用户定义函数的瓶颈,我还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

步骤1:查询减去ORDER BY部分

步骤2:创建一个包裹CursorWrapper的{​​{1}},计算每个位置的Jaro-Winkler距离,对位置进行排序,然后在覆盖所有需要位置的方法时使用排序后的位置(例如,CursormoveToPosition())。

答案 1 :(得分:1)

预先计算字符串长度并将它们添加到单独的列中。然后按那个长度对已退休的表进行排序。添加索引(如果可以)。然后添加额外的过滤器,例如你不想将“Srivastava Brahmaputra”与“John Smith”进行比较。长度远远超出了wack,因此将长度的这种比较排除在总长度的百分比之外。因此,如果您的单词是10个字符,则仅将其与10 + -2或10 + -3个字符的单词进行比较。

这样,您将显着减少此算法运行所需的次数。

通常在10万个条目的vocalbulary中,这样的过滤器会将比较次数减少到大约300次。除非你正在进行完整的记录链接,然后我想知道为什么要使用Android。您仍然需要为此应用概率方法并计算分数,这不是Android的工作(至少现在不是)。

同样在MS SQL Server中,Jaro Winkler包装到CLR函数中的字符串距离执行得更好,因为SQL Server本身并不支持arays,并且大部分处理都是围绕数组进行的。因此,在T-SQL中实现会增加太多开销,但SQL-CLR的工作速度非常快。