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

标签 mysql full-text-search innodb

我有一个学校数据表,在 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/

相关文章:

ruby - 在 ruby​​ 和 sinatra 中索引和搜索文本文件

MySql - 如何使用索引优化查询?

php - 选择....用于更新和 if 语句与 php

php - 每当字符串值被转换时,它就会被更改为 1 - PHP

php - MySQL 更新语句无法正常工作

mysql - 根据mysql中的多列对行进行分组

mysql - Node.js - 并发 SQL 查询导致服务器崩溃

string - 用于快速全文搜索的数据结构

mysql - 对选择最佳搜索引擎感到困惑

mysql - 需要帮助修复损坏的 Innodb 表