mysql - 带有带引号连字符的 bool 模式查询的 MySQL 中的意外行为

标签 mysql match-against

我对带连字符的搜索字符串有疑问,或者更确切地说是理解问题。

在我的表中有一个包含“公司”列的表。
该列中的条目之一是:A-Z Electro

下面的例子简化了很多(虽然真正的查询要复杂得多)——但是效果还是一样。

当我进行以下搜索时,我没有找到上述公司的行:

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('+\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

如果我进行以下搜索,则获取上述公司的行(注意仅将“A-Z”之前的 - 更改为 +:

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('-\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

如果我完全删除运算符,我也会得到该行:

SELECT  i.*
FROM my_table i
WHERE MATCH (i.company) AGAINST ('\"A-Z\" +Electro*' IN BOOLEAN MODE)
GROUP BY i.uid ORDER BY i.company ASC LIMIT 0, 40;

任何人都可以向我解释这种行为吗?因为我希望,在使用 + 搜索时,我也应该得到结果...

我刚刚用 myisam_ftdump 检查了表索引。 双字符词被正确索引,因为有像

这样的条目
14f2e8 0.7908264 ab  
3a164 0.8613265 dv  

还有一个条目:

de340 0.6801047 az  

我想这应该是 A-Z 的条目 - 所以搜索应该找到这个条目,不是吗?

最佳答案

ft_min_word_len 的默认值为 4。参见 this link有关这方面的信息。简而言之,您的系统不会为少于 4 个字符的词编制索引。

为什么这很重要?嗯:

  • A-Z 长度小于 4 个字符
  • ...因此它不在索引中
  • ...但是您的第一个查询 +"A-Z" 声明它必须在索引中才能使匹配成功
  • 其他两个(如果它不在索引中则匹配,如果这个或那个在索引中则匹配)有效,因为它在索引中。

连字符是一个红色的鲱鱼 - 原因是因为“A-Z”是三个字符长,而您的 FT 索引会忽略它。

关于mysql - 带有带引号连字符的 bool 模式查询的 MySQL 中的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307059/

相关文章:

php - 更新 "quantity remaining"而不刷新站点

基于 EAV 的库存控制应用程序的 MySQL 自连接

mysql - 对具有一对多关系的 3 个表进行 SQL 查询

MySQL - "exact match"针对某个值

mysql - 计算重复字段上连接的结果

mysql - 使用从其他两个列和第二个表派生的列回显 MySQL 表

MySQL 在 MyISAM 中匹配 0 结果,但在 InnoDB 上工作

mysql - 使用 MATCH ... AGAINST 优化 COUNT(*)

MySQL MATCH() 与 ()