MySQL 全文搜索 - 最小标记大小下的布尔搜索词意味着没有结果返回

MySQL FullText search - a boolean search term under the min token size means no results come back

我有一个 table 的学校数据,在 Mysql 5.6.33 中的列上有全文索引。

innodb_ft_min_token_size 设置为 3(默认值)。这是被索引的最小词。

如果我搜索 邮政编码,其中一个部分小于此大小,则搜索为具有该邮政编码的记录提供 0 分:

mysql> SELECT record_id, keywords, 
    -> MATCH (keywords) AGAINST ("+l4 +0uf" IN BOOLEAN MODE) as score
    -> FROM squirrel_schools 
    -> WHERE record_id = 137212;
+-----------+---------------------+-------+
| record_id | keywords            | score |
+-----------+---------------------+-------+
|    137212 | l4 0uf l40uf 137212 |     0 |
+-----------+---------------------+-------+
1 row in set (0.00 sec)

因此,我们可以看到它确实在关键字字段中包含两个必填词,但得分为 0。

这似乎是因为 innodb_ft_min_token_size 变量,因为如果我将邮政编码和搜索词更改为 "L4X 0UF",那么它就可以正常工作。所以它有一个两个字母的单词打破了它。

现在,我会理解它是否会忽略“+L4”位,因为它小于最小令牌大小:例如,如果它忽略“+L4” ,并且只是根据匹配的“+0UF”给该记录打分,那么这至少看起来与具有最小令牌大小的目的一致。

但是让它中断搜索,这样它就不会给包含该词的东西打分,这似乎是错误的。

如果我在这里做错了什么,或者我是否误解了最小令牌大小应该如何工作,有人可以解释一下吗?

编辑 - 我知道我可以更改 innodb_ft_min_token_size 变量,例如更改为 2 而不是 3,这可能会解决此特定搜索。但我想了解其背后的实际逻辑。

MyISAM 会为您排行,但 InnoDB 说:

"You demanded (via the +) that 14 be included, but since I did not index it, I did not find it. So the row is excluded."

这是否是有争议的 "right" 但它就是这样做的。

我使用的解决方法是不要在任何太短的字符串前面放置 +。如果我真的想强制 14 存在,那么我会添加类似

的内容
AND col REGEXP "[[:<:]]14[[:>:]]"

它会先执行 MATCH(更快),然后再检查 REGEXP

有趣的括号是 "word boundaries"。因此,当 14 作为 "word" 出现在 col 内的任何位置时,它就会匹配。它不会匹配,例如 146 但它会匹配 Address: 14 Main st. 或普通的 14.