我正在尝试使用Spring找到一种方法将用户搜索查询与搜索引擎中的数据库记录相匹配,但是当搜索查询包含特殊字符(例如带有重音元音的元素)时,我遇到了麻烦。
例如:搜索查询='cafe'。数据库记录='café'
我正在使用词干来查询数据库记录。
哪种匹配查询最直接的方法,包括特殊字符'café'与不包含此特殊字符'cafe'的字符串,反之亦然?
更新
我需要的所有信息都已缓存,因此在数据库中创建新列的方法并不那么吸引人。我正在寻找更多基于弹簧的解决方案。
答案 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;口音不敏感"。
我希望它可以帮到你。