我正在使用REST框架在Java中开发webservice。
我使用MySQL 5.1数据库作为后端。
我正在我的一张桌子上执行搜索操作,使用 模式 停止 。
但是现在我想对上面的搜索执行“Approximate_string_matching(模糊字符串搜索)”。考虑例如对于23 ST停止,用户可以提供搜索字符串第23站,第23站,第23站,第23 ST等。
对于 Approximate_string_matching 算法,我找到了链接 http://en.wikipedia.org/wiki/Approximate_string_matching
但我不知道如何实施它。
请大家帮我在 Java / MySQL 中实现 Approximate_string_matching算法?
提前谢谢。
答案 0 :(得分:5)
您可能想要研究的一件事是Levenshtein Distance Algorithm:
Levenshtein距离是用于测量差异的字符串度量 在两个序列之间。
Apache Commons Lang实现了这一功能。您可以使用getLevenshteinDistance(CharSequence s, CharSequence t, int threshold)来获取大致等于给定字符串的字符串。阈值会派上用场,这样您就可以丢弃与源词相距某个距离的单词,从而避免不必要的计算。
更好的方法是使用MySQL iteself提供的Levenshtein function。可以看到一个如何执行的简单示例here。
答案 1 :(得分:1)
根据您的解释,似乎每当任何用户提供搜索字符串为第23站,第23站,第23站或第23 ST时,过滤后的输出应为“23 ST stop”,对吗?
所以我假设你的所有停止名称都是XX YY停止,其中XX是数值,而YY是ST,VT,MT等某些站点的缩写
如果这是正确的,那么您可以通过执行多个过滤器以使第一个过滤器的输出输入到下一个过滤器来实现此目的。但在此之前你需要弄清楚“过滤什么”?
因此在这种特殊情况下,似乎“23”是查询字符串开头必须存在的子字符串,因此您需要从查询字符串中提取数字部分(您可以使用Java正则表达式)将结果应用为第一个过滤器,所以在这种情况下它将是:
where stops like '23%'
然后在输出这个结果时你可以应用下一个过滤器,在这种情况下,下一个过滤器可以是下一个单词的前两个字母(如果存在)并应用它的小写以保持一致性,所以在这种情况下它会是'st':
where LOWER(stops) like '%st%'
现在,您可以通过在同一查询中应用两个过滤器(尝试使用子查询)在查询部件本身中实现此功能,或者您可以引入第一个过滤器的结果集,并使用Java正则表达式对该结果集应用剩余的过滤器。 / p>