mysql - 如何使精确的 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
换句话说,搜索mun
或mün
给出完全相同的结果。
如何配置我的数据库,以便搜索mün
会为实际包含 letter 的单词提供更高的相关性ü
,但仍然考虑u
匹配?
解决方案
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;