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

mzillmmw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(435)

希望我只是看不到森林的树木,但我的全文搜索行为非常奇怪,我无法解决这个问题(我试图寻找一个解决方案,但到目前为止没有运气,所以非常感谢任何帮助。)
所以我的问题是:如果我搜索“t”ök”(匈牙利语中的“南瓜”意思)列表中还包含带有“tok”(意思是“case”)的结果。如果我要找南瓜的话,我显然不想要手机壳之类的东西。
我的系统是mysql,每个表都在innodb,utf8\u general\u 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:关键字并不总是在匈牙利语,因为这个网站是多语种的,所以我需要一个相对灵活的解决方案,这与大多数重音字母(如果可能的话)的作品

9ceoxa92

9ceoxa921#

字符串比较中的相等由排序规则指定。 general 会把每个字母当作他们的(拉丁)基本字符。您需要指定一个支持要区分的重音和元音的排序规则。
校勘包括语言细节。e、 g.西班牙语, n < ñ < o (虽然 n = ñ 对于基本上所有其他语言),对于瑞典语 Y = Ü ,对于德语(和大多数排序规则)来说 ß = ss ,对于匈牙利语(和许多其他排序规则),您有 o < ö .
所以对于匈牙利的网站,你可以选择 utf8_hungarian_ci ,并且如果您的软件可本地化为特定语言(和访问群体),则可能需要调整该列的排序规则,或者让管理员选择一种。不幸的是,对于全文搜索(与诸如 = 或者 order by ),不能在查询中动态指定排序规则,因此需要选择单个排序规则。
在一个通用的多语言网站上,大多数用户可能会期望搜索符合一个非常通用的英语/俄语/汉语模式,如果他们发现了,也不会感到惊讶 tök 进入时 tok . 他们甚至可能因为得不到这些而生气,特别是如果他们没有一个 ö 在他们的键盘上,实际上想买一个南瓜(并且知道它的匈牙利词)。大多数搜索引擎实际上会尽量不太狭隘,并希望找到 café 当你进来的时候 cafe ,并且经常投入一些工作来寻找 café 当你进来的时候 coffee , caffé 或者 cafée .
然而,没有一种语言能以不同的方式处理每一种口音和元音。如果你真的想区分每一个特殊的字符,你可以试试 utf8_bin (虽然我不确定我是否会称之为最灵活)。需要注意的是,它是区分大小写的,但是由于全文搜索总是不区分大小写的,所以这并不重要。如果对该列执行其他字符串比较(例如。 like ),这可能是有问题的。同时,你也会失去特定语言的行为,例如。 Y = Ü 或者 ß = ss (除非你自己实施)。

相关问题