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

时间:2017-03-01 19:54:27

标签: full-text-search mariadb

我很困惑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)

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

1 个答案:

答案 0 :(得分:1)

根据现有的排序规则,我认为捷克语无法做到这两种方式:

  • 始终对急性和caron口音不敏感,或
  • Alwasy对他们很敏感。

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

添加另一列

search TEXT NOT NULL

然后将search一个文本副本放入搜索中,但所有重音都被删除了。或者至少所有的卡通都被剥离了。您可以使用一组繁琐的REPLACE(...)函数来执行此操作。

然后让 列具有FULLTEXT索引,但原始列就是您显示的内容。

或者...

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

search TEXT COLLATION utf8_bin NOT NULL

(并FULLTEXT(search)