按Soundex(或类似算法)排序“接近度”

8

有没有办法让MySQL按照与搜索词“听起来”的接近程度排序结果?

我正在尝试对包含城市名称用户输入的字段进行排序。存在变体和拼写错误,我希望显示最“接近”的匹配项在顶部。

我知道soundex可能不是最好的算法,但如果它(或其他方法)可以相当成功——它可能值得由数据库完成排序。

1个回答

4
Soundex在这种情况下并不好用,因为不同的单词可能会给你相同的Soundex结果,因此会任意排序。这个问题的更好解决方案是Levenshein Edit Distance算法,你可以将其实现为数据库中的一个函数:链接到Levensheint impl. as MySql stored function!!!。
你也可以查看这个SO链接。它包含了该算法的Sql server (T-SQL-specific)实现,但应该可以进行移植。该算法的机制相当简单,只需要一个2D数组和对字符串的循环即可。

我在研究Levenshtein算法,如果我需要在代码中进行排序的话。看起来在数据库中实现正确的算法或使用已经在代码端可用的相同算法是更加明智的选择。 - Tim Lytle
如果您将其实现为MySql函数(答案中的链接),那么您应该能够在SQL中执行它。类似这样:SELECT CityName,Leven(CityName,compString)FROM City ORDER BY Leven(CityName,compString) - Paul Sasik
@Rinzler:是的,这篇文章已经快两年了,链接可能已经失效。无论如何,我找到了另一个MySQL实现的例子并重新链接了。 - Paul Sasik
谢谢我的朋友,你能在Zend框架中找到一个soundex的实现吗? - Rinzler
@Rinzler:看看这个PHP手册页面,了解如何使用Levenshtein算法:http://php.net/manual/en/function.levenshtein.php。我不熟悉Zend,但你应该能够利用这个算法。 - Paul Sasik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接