Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
区分重音的全文搜索(MySQL)_Mysql_Search_Full Text Search_Accent Sensitive - Fatal编程技术网

区分重音的全文搜索(MySQL)

区分重音的全文搜索(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:关键字并不总是用匈牙利语,因为这个网站是多语言的,所以我需要一

希望我只是看不到森林中的树木,但我的全文搜索行为非常奇怪,我无法自己解决这个问题。(我试图寻找解决方案,但迄今为止运气不佳,因此非常感谢任何帮助。)

所以我的问题是:如果我搜索“tök”(在匈牙利语中是“南瓜”的意思),列表中还包含带有“tok”(意思是“case”)的结果。如果我要找南瓜,我显然不想要手机壳之类的东西

我的系统是MySQL,每个表都在InnoDB、utf8\u general\u ci中

这是(简化的)查询:


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