1

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

在我的表中有一个表,其中有一列“公司”。
该列中的条目之一是:AZ 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;

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

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
我想这应该是 AZ 的条目 - 所以搜索应该找到这个条目,不是吗?

4

1 回答 1

0

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

为什么这很重要?出色地:

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

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

于 2012-11-09T11:50:31.140 回答