我有一个学校数据表,在 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”位,因为它小于最小 token 大小:例如,如果它忽略“+L4”,并且只给出了基于匹配“+0UF”对该记录进行评分,那么这至少看起来与具有最小 token 大小的目的一致。
但是让它中断搜索,这样它就不会为包含该单词的内容评分,这似乎是错误的。
有人可以解释一下我是否在这里做错了什么,或者我是否误解了最小 token 大小应该如何工作?
编辑 - 我知道我可以更改innodb_ft_min_token_size
变量,例如更改为2而不是3,这可能会解决这个特定的搜索。但我想了解其背后的实际逻辑。
最佳答案
MyISAM 会给你该行,但 InnoDB 说:
“您要求(通过 +
)包含 14
,但由于我没有索引它,所以我没有找到它。因此该行被排除。 ”
这是否“正确”还有待商榷,但事实就是如此。
我使用的解决方法是不在任何太短的字符串前面放置 +
。如果我真的想强制 14
存在,那么我添加类似的内容
AND col REGEXP "[[:<:]]14[[:>:]]"
它将首先执行MATCH
(更快),然后使用REGEXP
进行双重检查。
有趣的括号是“单词边界”。因此,当 14
作为“单词”出现在 col
内的任何位置时,它都会匹配。它不会匹配,例如 146
,但会匹配 Address: 14 Main st.
或普通 14
。
关于MySQL 全文搜索 - 最小标记大小下的 bool 搜索项意味着没有结果返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55609580/