MySQL中的意外行为,带有布尔模式 - 引用连字符的字符串



我有一个问题,或者是引用的连字符搜索串的理解问题。

在我的桌子上有一个带有"公司"专栏的表。
该列的条目之一是: 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之前的a -Z&quort;

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;

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

我只是用myisam_ftdump检查了表索引。两个字符的字可以正确地索引,因为有类似的条目

14f2e8 0.7908264 ab  
3a164 0.8613265 dv  

也有一个条目:

de340 0.6801047 az  

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

ft_min_word_len的默认值为4。有关此信息的信息,请参见此链接。简而言之,您的系统不会索引少于4个字符的单词。

为什么这很重要?好:

  • A-Z小于4个字符
  • ...因此不在索引中
  • ...但是您的第一个查询+"A-Z"指出,它必须在索引中,以使比赛成功
  • 另外两个(如果不在索引中,则匹配,如果该索引或在索引中匹配)起作用,因为它在索引中不是不是

连字符是红鲱鱼 - 原因是" A -Z"是三个字符,而您的FT索引忽略了它。

相关内容

  • 没有找到相关文章

最新更新