我想知道如何以这种方式运行SQLite订单
select * from contacts order by jarowinkler(contacts.name,'john smith');
我知道Android存在用户定义函数的瓶颈,我还有其他选择吗?
答案 0 :(得分:1)
步骤1:查询减去ORDER BY
部分
步骤2:创建一个包裹CursorWrapper
的{{1}},计算每个位置的Jaro-Winkler距离,对位置进行排序,然后在覆盖所有需要位置的方法时使用排序后的位置(例如,Cursor
,moveToPosition()
)。
答案 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的工作速度非常快。