我有一个问题,或者是引用的连字符搜索串的理解问题。
在我的桌子上有一个带有"公司"专栏的表。
该列的条目之一是: 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索引忽略了它。