2

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

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

我知道 Android 在用户定义的功能方面存在瓶颈,我有替代方案吗?

4

2 回答 2

1

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

步骤#2:创建一个CursorWrapper包装你的Cursor,计算每个位置的 Jaro-Winkler 距离,对位置进行排序,然后在覆盖所有需要位置的方法时使用排序的位置(例如,moveToPosition()moveToNext())。

于 2010-05-17T10:58:48.603 回答
1

预先计算字符串长度并将它们添加到单独的列中。然后按该长度对整个表格进行排序。添加索引(如果可以)。然后添加额外的过滤器,例如您不想将“Srivastava Brahmaputra”与“John Smith”进行比较。长度太不正常了,所以排除这些长度比较占总长度的百分比。因此,如果您的单词是 10 个字符,则仅将其与具有 10+-2 或 10+-3 个字符的单词进行比较。

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

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

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

于 2011-05-31T15:42:43.607 回答