gpt4 book ai didi

mysql - 带有带引号连字符的 bool 模式查询的 MySQL 中的意外行为

转载 作者:行者123 更新时间:2023-11-30 23:25:59 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com