口音敏感的全文搜索(MySQL)

时间:2018-10-16 18:46:26

标签: mysql search full-text-search accent-sensitive

希望我看不到树林,但是我的全文搜索行为很奇怪,我自己无法解决。 (我试图寻找解决方案,但到目前为止还算不上运气,因此,非常感谢您的帮助。)

所以我的问题是:如果我搜索“ tök”(在匈牙利语中表示“ pumpkin”),则列表中还会包含带有“ tok ”的结果(这意味着“案件”)。如果我搜索南瓜,我显然不想要手机壳或类似的东西。

我的系统是MySQL,每个表都位于 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:关键字并不总是匈牙利语,因为该网站是多语言的,所以我需要一个相对灵活的解决方案,该解决方案可以处理大多数带重音的字母(如果可能)

1 个答案:

答案 0 :(得分:1)

字符串比较中的相等由排序规则指定。 general将把每个字母都当作(拉丁)基本字符。您需要指定一个排序规则,以支持要与众不同的重音符号和变音符号。

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

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

在通用的多语言站点上,大多数用户可能希望搜索符合非常通用的英语/俄语/中文模式,如果在输入tök时找到tok也不会感到惊讶。他们甚至可能会生气而没有得到这些,尤其是如果他们的键盘上没有ö并且实际上想购买南瓜(并且知道匈牙利的意思)的时候。实际上,大多数搜索引擎都会尽量不要太狭窄,而希望在您输入café时找到cafe,并且经常会花一些精力在您输入{{ 1}},cafécoffee

没有一种语言可以处理所有的口音和变音符号。如果您确实想区分每个单独的特殊字符,则可以尝试使用caffé(尽管我不确定是否将其称为最灵活的)。重要的是要注意它区分大小写,但是由于全文搜索始终不区分大小写,因此这无关紧要。如果您在此列上进行其他字符串比较(例如cafée),则可能会出现问题。此外,您将失去特定于语言的行为,例如utf8_binlike(除非您自己实施)。