我对带连字符的搜索字符串有疑问,或者更确切地说是理解问题。
在我的表中有一个包含“公司”列的表。
该列中的条目之一是: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/