0

我在许多列上有一个全文索引,我试图在这些列上做一个 MATCH AGAINST IN BOOLEAN MODE,试图找到一个电子邮件地址。结果如下:

  • 如果我搜索“test@email.com”(带引号) - 查询返回正确的结果
  • 如果我搜索“a@b.com”(带引号) - 查询不返回任何内容

有人可以告诉我为什么没有返回一封简短的电子邮件 a@b.com,我将如何解决这个问题?

这是我正在使用的查询:

SELECT MATCH(email, phone, title, description) AGAINST('"a@b.com"' IN BOOLEAN MODE) AS score 
FROM thetable WHERE MATCH(email, phone, title, description) 
AGAINST('"a@b.com"' IN BOOLEAN MODE) ORDER BY `status` DESC, score DESC
4

2 回答 2

1

这是两个问题的组合:

  1. @不被认为是“单词字符”,也不是-,所以搜索a@b.com实际上归结为搜索单词ab并且com
  2. a并且b比 ft_min_word_len 短

解决方案是制作@并被.视为单词字符。http://dev.mysql.com/doc/refman/5.6/en/fulltext-fine-tuning.html上列出了几种方法

最实用的方法是添加自定义排序规则,如

http://dev.mysql.com/doc/refman/5.6/en/full-text-adding-collat​​ion.html

于 2014-12-06T12:48:48.517 回答
0

更新:

a) 您需要 在 my.cnf中设置ft_min_word_len = 1 。

b) 显示变量的输出

ft_min_word_len                                   | 1 

c) 触发以下查询:

mysql> SELECT name,email FROM jos_users WHERE MATCH (email) AGAINST ('a@b.com') limit 1;
 +--------+---------+
 | name   | email   |
 +--------+---------+
 | kap | a@b.com |
 +--------+---------+
 1 row in set (0.00 sec)

希望这会有所帮助。

〜K


我认为您需要更改ft_min_word_len

MySQLdoc 微调中所述

要索引的单词的最小和最大长度由 ft_min_word_len 和 ft_max_word_len 系统变量定义。(请参阅第 5.1.4 节,“服务器系统变量”。)默认最小值是四个字符;默认最大值取决于版本。如果更改任一值,则必须重建 FULLTEXT 索引。例如,如果您想搜索三个字符的单词,您可以通过将以下行放在选项文件中来设置 ft_min_word_len 变量:

[mysqld] ft_min_word_len=3 然后重新启动服务器并重建 FULLTEXT 索引。请特别注意此列表后面的说明中有关 myisamchk 的注释。

于 2013-04-10T06:45:01.433 回答