MySQL FullText搜索-最小令牌大小下的布尔搜索词意味着没有结果返回

时间:2019-04-10 09:49:45

标签: mysql full-text-search innodb

在Mysql 5.6.33中,我有一张学校数据表,其列上有全文索引。

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

如果我搜索,其中一个部分小于该大小,则搜索会给该邮政编码的记录打零分:

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”,并给出了根据匹配的“ + 0UF”对记录进行评分,那么这至少看起来与最小令牌大小的目的是一致的。

但是要让它破坏搜索范围,以免给单词中带有单词的单词打分,这似乎是错误的。

有人可以解释我在这里做错了什么,还是我误解了最小令牌大小应该如何工作?

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

1 个答案:

答案 0 :(得分:1)

MyISAM会让您胜任,但是InnoDB表示:

“您(通过+要求包含14,但是由于我没有对其进行索引,所以没有找到它。因此该行被排除了。”

这是否是对的还是有争议的。

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

AND col REGEXP "[[:<:]]14[[:>:]]"

它将首先(更快)执行MATCH,然后使用REGEXP仔细检查。

有趣的括号是“单词边界”。因此,当14内部col作为“单词”出现时,它就会匹配。它不匹配,例如146,但是将匹配Address: 14 Main st.或纯14