首页 > 解决方案 > 如何使精确的 unicode 字符优先于 ASCII 版本?

问题描述

我有一个包含德国城镇名称的数据库,例如慕尼黑和明斯特。

如果我这样查询:

SELECT name,
       MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) AS relevance
FROM place_names
ORDER BY relevance DESC

mun对于包含 的所有地方,或在不考虑变音符号时mün变平的任何其他文本,我得到相同的相关值。mun换句话说,搜索munmün给出完全相同的结果。

如何配置我的数据库,以便搜索mün会为实际包含 letter 的单词提供更高的相关性ü,但仍然考虑u匹配?

标签: mysqlsqlunicodefull-text-searchdiacritics

解决方案


CREATE TABLE place_names (id SERIAL PRIMARY KEY, name VARCHAR(255));
CREATE FULLTEXT INDEX idx ON place_names (name);
INSERT INTO place_names (name) VALUES ('Munich'), ('Münster');
SELECT * FROM place_names;
ID 姓名
1 慕尼黑
2 明斯特
SELECT name,
       MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) AS relevance
FROM place_names
ORDER BY relevance DESC;
姓名 关联
慕尼黑 0.000000001885928302414186
明斯特 0.000000001885928302414186
ALTER TABLE place_names ADD COLUMN name2 VARCHAR(255) COLLATE utf8mb4_0900_bin AS (name) STORED;
CREATE FULLTEXT INDEX idx2 ON place_names (name2);
SELECT name,
       MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) AS relevance,
       MATCH(name2) AGAINST('+mün*' IN BOOLEAN MODE) AS relevance2
FROM place_names
ORDER BY relevance DESC;
姓名 关联 相关性2
慕尼黑 0.000000001885928302414186 0
明斯特 0.000000001885928302414186 0.0906190574169159

db<>在这里摆弄

因此

SELECT name,
       MATCH(name) AGAINST('+mün*' IN BOOLEAN MODE) AS relevance
FROM place_names
ORDER BY MATCH(name2) AGAINST('+mün*' IN BOOLEAN MODE) DESC;

推荐阅读