我很困惑MariaDB全文搜索如何处理重音。我发现它不一致,我想了解原因。
为了说明我的问题,我们可以创建一个这样的测试表:
CREATE TABLE `fulltext_test` (
`title` varchar(128) COLLATE utf8_czech_ci NOT NULL,
FULLTEXT KEY `title` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=277 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci
我定义了collate
,因为在现实生活中,我需要根据该列执行排序,所以我真的想要utf8_czech_ci
。
让我们插入一行:
INSERT INTO `fulltext_test` VALUES ('klíč');
现在测试它的行为方式。这是预期的行为:
> SELECT * FROM `fulltext_test` WHERE MATCH (`title`) AGAINST ("klíč" IN BOOLEAN MODE);
+--------+
| title |
+--------+
| klíč |
+--------+
1 row in set (0.00 sec)
这就是困扰我的事。从第一个结果(搜索“klíc”)我会说全文搜索是准确敏感的,但第二个结果(搜索“klič”,注意细微差别:í而不是我)证明它不是。
> SELECT * FROM `fulltext_test` WHERE MATCH (`title`) AGAINST ("klíc" IN BOOLEAN MODE);
Empty set (0.00 sec)
> SELECT * FROM `fulltext_test` WHERE MATCH (`title`) AGAINST ("klič" IN BOOLEAN MODE);
+--------+
| title |
+--------+
| klíč |
+--------+
1 row in set (0.00 sec)
为什么会这样?我该如何配置?
答案 0 :(得分:1)
根据现有的排序规则,我认为捷克语无法做到这两种方式:
这是一个笨拙的解决方法:
添加另一列
search TEXT NOT NULL
然后将search
一个文本副本放入搜索中,但所有重音都被删除了。或者至少所有的卡通都被剥离了。您可以使用一组繁琐的REPLACE(...)
函数来执行此操作。
然后让 列具有FULLTEXT
索引,但原始列就是您显示的内容。
或者...
可能足以使search
成为原始列的副本,但排序规则除外:
search TEXT COLLATION utf8_bin NOT NULL
(并FULLTEXT(search)
)