java - Spring中的普通字符和特殊字符匹配字符串

标签 java spring

我正在尝试使用 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/

相关文章:

java - 被 CORS 阻止的 Spring Gateway 请求(无访问控制-允许-源头)

java - 可序列化的类无法反序列化

java - SOAP Web 服务是否只支持 "POST"http 方法

spring - 如何运行 spring boot jar

Java Spring Boot MongoDB 配置

spring - 重新平衡后,kafka 停止使用来自新分配分区的消息

java - 如何解决spring-modules-validation.jar vlang.tld中遇到XMLStreamException Unexpected value 'body-content'

java - 由 : java. lang.IllegalArgumentException : org. hibernate.QueryException 引起:无法解析属性:

java - 使用一个 POJO 类来处理不同的 xml 响应

java程序无法读取字符串