如何配置数据库让精确匹配的Unicode字符优先级高于ASCII等效字符
问题原因
当前数据库的全文检索默认使用重音不敏感排序规则,会自动将ü归一化为u进行匹配计算,所以包含mun和mün的结果基础相关性得分完全一致。
可行解决方案
方案1:查询时新增自定义权重(最快生效,无需修改表结构)
在原有全文检索得分的基础上,给实际包含ü的结果额外加权重即可,权重数值可根据业务需求调整:
SELECT name, (MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) + CASE WHEN name LIKE BINARY '%mün%' THEN 2 ELSE 0 END) AS total_relevance FROM place_names WHERE MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) > 0 ORDER BY total_relevance DESC
这里用LIKE BINARY是为了强制区分变音符号,避免排序规则影响判断。
方案2:新增重音敏感列优化性能(适合高频同类查询场景)
如果经常需要处理德语变音符号(ä/ö/ü/ß)的搜索需求,可以提前加生成列存储重音敏感的名称,避免每次查询做全表模糊匹配的性能损耗:
-- 新增重音敏感的存储生成列 ALTER TABLE place_names ADD COLUMN name_accent_sensitive VARCHAR(255) GENERATED ALWAYS AS (name) STORED COLLATE utf8mb4_0900_as_ci; -- 该排序规则为重音敏感、大小写不敏感,适配德语场景 -- 优化后的查询语句 SELECT name, (MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) + CASE WHEN name_accent_sensitive LIKE '%mün%' THEN 2 ELSE 0 END) AS total_relevance FROM place_names WHERE MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) > 0 ORDER BY total_relevance DESC
两种方案都可以保留所有匹配mun的结果,同时将实际包含ü的结果排在更靠前的位置。
内容的提问来源于stack exchange,提问作者theberzi
相关产品推荐
相关产品推荐

