1

我正在使用 REST 框架在 Java 中开发 Web 服务。

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

我正在我的一张桌子上执行搜索操作,说停止使用类似模式。

但现在我想为上述搜索执行“Approximate_string_matching(模糊字符串搜索)”。考虑例如 23 ST 站,用户可以提供搜索字符串 23rd station, 23rd, 23 station, 23rd ST 等。

对于这个Approximate_string_matching算法,我找到了链接http://en.wikipedia.org/wiki/Approximate_string_matching

但我不知道如何实现它。

请大家帮我在Java / MySQL中实现Approximate_string_matching 算法

先感谢您。

4

2 回答 2

5

您可能想要研究的一件事是Levenshtein 距离算法

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

Apache Commons Lang 有一个现成的实现。您可以使用 getLevenshteinDistance(CharSequence s, CharSequence t, int threshold)来获取大约等于给定字符串的字符串。阈值会派上用场,这样您就可以丢弃与源单词有一定距离的单词,从而避免不必要的计算。

更好的方法是使用MySQL 自身提供的Levenshtein 函数。可以在此处查看如何执行的简单示例。

于 2012-10-23T05:46:13.690 回答
1

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

所以我假设您所有的站点名称都将类似于 XX YY 站点,其中 XX 是一个数值,而 YY 是 ST、VT、MT 等站点的缩写

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

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

 where stops like '23%'

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

 where LOWER(stops) like '%st%'

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

于 2012-10-23T06:24:29.660 回答