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

Accent sensitive FULL TEXT search (MySQL)

希望我只是只见树木不见森林,但我的全文搜索行为非常奇怪,我无法自己解决这个问题。 (我试图寻找解决方案,但到目前为止没有成功,所以非常感谢您的帮助。)

所以我的问题是:如果我搜索“tök”(在匈牙利语中表示 "pumpkin"),该列表还包含带有“”的结果tok”(意思是 "case")。如果我搜索南瓜,我显然不想要 phone 案例或类似的东西。

我的系统是 MySQL 每个 table 在 InnoDB 中,utf8_general_ci

这是(简化的)查询:

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

PS: 关键字并不总是匈牙利语,因为这个网站是多语言的,所以我需要一个相对灵活的解决方案,可以处理大多数重音字母(如果可能的话)

字符串比较中的相等性由排序规则指定。 general 会将每个字母视为其(拉丁)基本字符。您需要指定一个支持您想要区分的重音符号和变音符号的排序规则。

排序规则包括语言细节。例如。对于西班牙语,n < ñ < o(而基本上所有其他语言都是 n = ñ),对于瑞典语,您有 Y = Ü,对于德语(和大多数排序规则),有 ß = ss,对于匈牙利语(以及许多其他归类)你有 o < ö

因此,对于匈牙利语站点,您可能希望选择 utf8_hungarian_ci,并且如果您的软件可本地化为特定语言(和受众),您可能希望调整该栏的排序规则或让管理员选择一个。不幸的是,对于全文搜索(与 =order by 等其他字符串比较不同),您无法在查询中即时指定排序规则,因此您需要选择一个排序规则。

在一般的多语言网站上,大多数用户可能希望搜索符合非常一般的 english/russian/chinese-schema,如果他们在输入 tok 时找到 tök,也不会感到惊讶。他们甚至可能因为没有得到这些而生气,特别是如果他们的键盘上没有 ö 并且实际上想买一个南瓜(并且知道它的匈牙利语单词)。大多数搜索引擎实际上会尽量不要太窄,并希望在您输入 cafe 时找到 café,并且通常会在您输入 [= 时花费一些精力来找到 café 25=]、caffécafée.

不过,没有一种语言能够以不同的方式处理每种口音和变音符号。如果你真的想区分每一个特殊字符,你可能想尝试utf8_bin(虽然我不确定我是否会称它为最灵活)。重要的是要注意它区分大小写,但由于全文搜索始终不区分大小写,因此这无关紧要。如果您在此列上进行其他字符串比较(例如 like),这可能会有问题。此外,您将失去特定于语言的行为,例如Y = Üß = ss(除非您自己实现)。