我正在尝试使用 Spring 找到一种将用户搜索查询与搜索引擎中的数据库记录进行匹配的方法,但是当搜索查询包含特殊字符(例如带重音的元音)时,我遇到了麻烦。
例如:搜索查询 = 'cafe'。数据库记录 = 'café'
我正在使用词干来查询数据库记录。
将包含特殊字符“cafe”的查询与不包含该特殊字符“cafe”的字符串进行匹配的最直接方法是什么?反之亦然?
更新
我需要的所有信息都已缓存,因此在数据库中创建新列的方法并不那么有吸引力。我正在寻找一种更加基于 Spring 的解决方案。
最佳答案
您可以使用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) 和 尖音符号
U+0301
\p{InCombiningDiariticMarks}+
正则表达式将匹配所有此类变音符号代码,我们将用空字符串替换它们。
您的查询
可能类似于:
SQL 服务器
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 代表“不区分大小写”,AI 代表“不区分重音”。
希望对你有帮助。
关于java - Spring中的普通字符和特殊字符匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41478768/