MariaDB 二进制全文搜索中重音处理不一致

Inconsistent handling of accents in binary fulltext search in MariaDB

我对 MariaDB 全文搜索如何处理重音感到困惑。我发现它不一致,我想了解为什么。

为了说明我的问题,让我们像这样创建一个测试 table:

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,因为在现实生活中table我需要根据该列进行排序,所以我真的想要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č",请注意细微差别:í 而不是 i) 证明它不是。

> 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)

为什么会这样?我该如何配置它?

使用现有的排序规则,我认为没有办法为捷克语执行以下任一操作:

  • 始终对锐音和卡隆重音不敏感,或者
  • 总是对他们敏感。

这是一个笨拙的解决方法:

再添加一列

search TEXT NOT NULL

然后将要搜索的文本副本放入 search,但去掉所有重音。或者至少所有的carons都被剥离了。您可以使用一组繁琐的 REPLACE(...) 函数来完成此操作。

然后 那个 列有 FULLTEXT 索引,但原始列是你显示的。

或者...

可能足以使search成为原始列的副本,但排序规则除外:

search TEXT COLLATION utf8_bin NOT NULL

(并且有 FULLTEXT(search)