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
.
我有一个 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
.