希望我只是看不到森林的树木,但我的全文搜索行为非常奇怪,我无法解决这个问题(我试图寻找一个解决方案,但到目前为止没有运气,所以非常感谢任何帮助。)
所以我的问题是:如果我搜索“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:关键字并不总是在匈牙利语,因为这个网站是多语种的,所以我需要一个相对灵活的解决方案,这与大多数重音字母(如果可能的话)的作品
1条答案
按热度按时间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
(除非你自己实施)。