使用带连字符串联字符串的布尔模式查询在MySQL中出现意外行为

时间:2012-11-09 11:15:22

标签: mysql hyphen 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;

如果我执行以下搜索,请获取上述公司的行(通知仅更改 - 在\&#34之前的+ +; 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的条目 - 所以搜索应该找到这个条目,不应该吗?

1 个答案:

答案 0 :(得分:0)

ft_min_word_len的默认值为4.有关相关信息,请参阅this link。简而言之,您的系统不会索引少于4个字符的单词。

为什么这很重要?良好:

  • A-Z长度少于4个字符
  • ...因此它不在索引
  • ...但您的第一个查询+"A-Z"表明它必须位于索引中才能使匹配成功
  • 另外两个(匹配,如果它不在索引中,匹配,如果这个或那个在索引中)起作用,因为它在索引中不是

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