如何在Java/MySQL中实现近似字符串匹配(模糊字符串搜索)?

如何在Java/MySQL中实现近似字符串匹配(模糊字符串搜索)?,java,mysql,search,Java,Mysql,Search,我正在使用REST框架用Java开发webservice 我使用MySQL 5.1数据库作为后端 我正在对我的一个表执行搜索操作,使用like模式说停止 但现在我想对上述搜索执行“近似字符串匹配(模糊字符串搜索)”。考虑一个例如23 ST站,用户可以提供搜索字符串第二十三站,第二十三,23站,第二十三ST等 对于这个近似字符串匹配算法,我找到了链接http://en.wikipedia.org/wiki/Approximate_string_matching 但我不知道如何实施它 请大家帮我在J

我正在使用REST框架用Java开发webservice

我使用MySQL 5.1数据库作为后端

我正在对我的一个表执行搜索操作,使用like模式说停止

但现在我想对上述搜索执行“近似字符串匹配(模糊字符串搜索)”。考虑一个例如23 ST站,用户可以提供搜索字符串第二十三站,第二十三,23站,第二十三ST等

对于这个近似字符串匹配算法,我找到了链接http://en.wikipedia.org/wiki/Approximate_string_matching

但我不知道如何实施它

请大家帮我在Java/MySQL中实现近似字符串匹配算法


提前谢谢。

您可能想了解的一件事是:

Levenshtein距离是用于测量差异的字符串度量 在两个序列之间

ApacheCommonsLang有一个现成的实现。您可以使用获取近似等于给定字符串的字符串。阈值将派上用场,以便您能够丢弃与源单词有一定距离的单词,从而避免不必要的计算


更好的方法是使用自己提供的。可以看到一个简单的执行示例。

您可能希望了解的一件事是:

Levenshtein距离是用于测量差异的字符串度量 在两个序列之间

ApacheCommonsLang有一个现成的实现。您可以使用获取近似等于给定字符串的字符串。阈值将派上用场,以便您能够丢弃与源单词有一定距离的单词,从而避免不必要的计算


更好的方法是使用自己提供的。可以看到如何执行的一个简单示例。

根据您的解释,似乎每当任何用户提供搜索字符串作为第23站、第23站、第23站或第23站时,过滤后的输出应该是“第23站”,对吗

所以我假设你们所有的站点名称都是XX YY stop,其中XX是一个数值,YY是ST、VT、MT等站点的缩写

如果这是正确的,那么实现这一点的一种方法是执行多个过滤器,以便将第一个过滤器的输出输入到下一个过滤器。但在此之前,你需要弄清楚“过滤什么”

因此,在这种特殊情况下,“23”似乎是查询字符串开头必须出现的子字符串,因此您需要从查询字符串中提取数字部分(您可以使用Java正则表达式)将结果应用为第一个筛选器,因此在这种情况下,它将是:

 where stops like '23%'
然后在这个结果的输出上,您可以应用下一个过滤器,在这种情况下,下一个过滤器可以是下一个单词(如果存在)的前两个字母,并应用其小写以保持一致性,因此在这种情况下,它将是“st”:

 where LOWER(stops) like '%st%'

现在,您可以通过在同一查询中应用两个过滤器(尝试使用子查询)在查询部分本身实现这一点,或者您可以引入第一个过滤器的结果集,并使用Java正则表达式在该结果集上应用剩余的过滤器。

根据您的解释,似乎每当任何用户提供搜索字符串作为第23站,第23站,23号站,或者23号站,那么过滤后的输出应该是“23号站”,对吗

所以我假设你们所有的站点名称都是XX YY stop,其中XX是一个数值,YY是ST、VT、MT等站点的缩写

如果这是正确的,那么实现这一点的一种方法是执行多个过滤器,以便将第一个过滤器的输出输入到下一个过滤器。但在此之前,你需要弄清楚“过滤什么”

因此,在这种特殊情况下,“23”似乎是查询字符串开头必须出现的子字符串,因此您需要从查询字符串中提取数字部分(您可以使用Java正则表达式)将结果应用为第一个筛选器,因此在这种情况下,它将是:

 where stops like '23%'
然后在这个结果的输出上,您可以应用下一个过滤器,在这种情况下,下一个过滤器可以是下一个单词(如果存在)的前两个字母,并应用其小写以保持一致性,因此在这种情况下,它将是“st”:

 where LOWER(stops) like '%st%'

现在,您可以通过在同一个查询中应用两个过滤器(尝试使用子查询)在查询部分本身实现这一点,或者您可以引入第一个过滤器的结果集,并使用Java正则表达式在该结果集上应用剩余的过滤器。

感谢npinti的快速回复。我将对此进行研究,然后再与您联系。嗨,npinti,我如何在java中实现Levenshtein距离算法?@Deepu:Apache Commons已经提供了一个实现。如果你想弄脏你的手,我链接的Wiki页面有一个Levenshtein算法的通用算法,所以你可以看看。请注意,不在数据库上执行此操作会有一些性能缺陷,因为您需要从数据库中获取所有数据,然后在Java代码中进行处理。感谢npinti的快速回复。我将对此进行研究,然后再与您联系。嗨,npinti,我如何在java中实现Levenshtein距离算法?@Deepu:Apache Commons已经提供了一个实现。如果你想弄脏你的手,我链接的Wiki页面有一个Levenshtein算法的通用算法,所以你可以看看。请注意,不在数据库上执行此操作会有一些性能缺陷,因为您需要从数据库中获取所有数据,然后在Java代码中进行处理。感谢sactiw的解释。你指出了正确的情况。我会在我的代码里试试谢谢sactiw的解释。