区分重音的全文搜索(MySQL)
希望我只是看不到森林中的树木,但我的全文搜索行为非常奇怪,我无法自己解决这个问题。(我试图寻找解决方案,但迄今为止运气不佳,因此非常感谢任何帮助。) 所以我的问题是:如果我搜索“tök”(在匈牙利语中是“南瓜”的意思),列表中还包含带有“tok”(意思是“case”)的结果。如果我要找南瓜,我显然不想要手机壳之类的东西 我的系统是MySQL,每个表都在InnoDB、utf8\u general\u ci中 这是(简化的)查询:区分重音的全文搜索(MySQL),mysql,search,full-text-search,accent-sensitive,Mysql,Search,Full Text Search,Accent Sensitive,希望我只是看不到森林中的树木,但我的全文搜索行为非常奇怪,我无法自己解决这个问题。(我试图寻找解决方案,但迄今为止运气不佳,因此非常感谢任何帮助。) 所以我的问题是:如果我搜索“tök”(在匈牙利语中是“南瓜”的意思),列表中还包含带有“tok”(意思是“case”)的结果。如果我要找南瓜,我显然不想要手机壳之类的东西 我的系统是MySQL,每个表都在InnoDB、utf8\u general\u ci中 这是(简化的)查询: PS:关键字并不总是用匈牙利语,因为这个网站是多语言的,所以我需要一
PS:关键字并不总是用匈牙利语,因为这个网站是多语言的,所以我需要一个相对灵活的解决方案,可以处理大多数重音字母(如果可能的话)字符串比较中的相等是由排序规则指定的
general
会将每个字母视为其(拉丁)基本字符。您需要指定一个排序规则,该排序规则支持您想要区分的重音和元音
排序规则包括语言细节。例如,对于西班牙语,n<ñ
(而对于基本上所有其他语言,n=ñ
),对于瑞典语你有Y=Ü
,对于德语(和大多数排序规则)有ß=ss
,对于匈牙利语(和许多其他排序规则)你有o
因此,对于匈牙利网站,您可能需要选择utf8\u hungarian\u ci
,如果您的软件可本地化为特定语言(和受众),您可能需要调整该列的排序规则,或者让管理员选择一种。不幸的是,对于全文搜索(与其他字符串比较(如=
或order by
)相比),您无法在查询中动态指定排序规则,因此需要选择单个排序规则
在通用多语言网站上,大多数用户可能希望搜索符合非常通用的英语/俄语/汉语模式,如果他们在输入tok
时发现tök
,也不会感到惊讶。他们甚至可能会因为没有得到南瓜而恼火,尤其是如果他们的键盘上没有ö
,并且真的想买一个南瓜(并且知道它的匈牙利语)。事实上,大多数搜索引擎都会尽量不太狭隘,当你进入cafe
时,他们希望找到cafe
,当你进入coffee
、caffee
或caffee
时,他们往往会投入一些工作来找到cafe
但是,没有一种语言能够以不同的方式处理每种口音和元音。如果你真的想区分每一个特殊字符,你可以尝试
utf8\u bin
(尽管我不确定我是否会称之为最灵活的)。重要的是要注意它是区分大小写的,但由于全文搜索始终不区分大小写,所以这并不重要。如果在此列上进行其他字符串比较(例如像),这可能会有问题。此外,您将失去特定于语言的行为,例如Y=Ü
或ß=ss
(除非您自己实现)。谢谢@solarflar这非常有用!
SELECT id_item,item_title,tag_name, MATCH (item_title) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS title_relevance, MATCH (tag_name) AGAINST ('tök' IN NATURAL LANGUAGE MODE) AS tag_relevance
FROM item_translations
WHERE NULL IS NULL
AND ( MATCH (tile_item_title) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) OR MATCH (tag_name) AGAINST ('+tök' IN NATURAL LANGUAGE MODE ) )
AND id_language=1
ORDER BY title_relevance DESC, tag_relevance DESC
LIMIT 0,40