在Spring中将字符串与普通字符和特殊字符匹配

时间:2017-01-05 06:44:37

标签: java spring

我正在尝试使用Spring找到一种方法将用户搜索查询与搜索引擎中的数据库记录相匹配,但是当搜索查询包含特殊字符(例如带有重音元音的元素)时,我遇到了麻烦。

例如:搜索查询='cafe'。数据库记录='café'

我正在使用词干来查询数据库记录。

哪种匹配查询最直接的方法,包括特殊字符'café'与不包含此特殊字符'cafe'的字符串,反之亦然?

更新

我需要的所有信息都已缓存,因此在数据库中创建新列的方法并不那么吸引人。我正在寻找更多基于弹簧的解决方案。

1 个答案:

答案 0 :(得分:5)

您可以使用java.text.Normalizer,例如关注:

import java.text.Normalizer;
import java.text.Normalizer.Form;

public static String removeAccents(String text) {
    return text == null ? null :
        Normalizer.normalize(text, Form.NFD)
            .replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

Normalizer将原始字符拆分为一组两个字符(字母和重音符号)。 例如,字符(U + 00E1)将分为a(U + 0061)和acute accent U + 0301

\p{InCombiningDiacriticalMarks}+正则表达式将匹配所有这些变音符号代码,我们将用空字符串替换它们。

您的query可能就像:

SQL SERVER

SELECT * FROM Table
WHERE Column Like '%stringwithoutaccents%' COLLATE Latin1_general_CI_AI

ORACLE(来自10g)

SELECT * FROM Table
WHERE  NLSSORT(Column, 'NLS_SORT = Latin_AI')
Like NLSSORT('%stringwithoutaccents%', 'NLS_SORT = Latin_AI')

CI代表" Case Insensitive"和#34;口音不敏感"。

我希望它可以帮到你。