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