MySQL全文搜索不适用于电子邮件地址

时间:2018-01-29 00:45:44

标签: php mysql laravel

我正在使用 Laravel 5.5 &的 MySQL的即可。我想使用全文搜索电子邮件,但我一直收到此错误:

  

语法错误或访问冲突:1064语法错误,意外'@',   期待$ end(SQL:select * from users where MATCH(users.email)   反对(+用户@ * IN BOOLEAN模式)或MATCH(users.username)反对   (+ user @ * IN BOOLEAN MODE))

这就是我查询的方式

$keyword        = $request->keyword;
$exp            = explode(' ', $keyword);

$s = '';
$c = 1;
foreach ($exp AS $e)
{
    $s .= "+$e*";

    if ($c + 1 == count($exp))
        $s .= ' ';

    $c++;
}

$users = User::whereRaw("MATCH (users.email) AGAINST (? IN BOOLEAN MODE)", [$s])
            ->orWhereRaw("MATCH (users.username) AGAINST (? IN BOOLEAN MODE)", [$s])
            ->get();

我已经尝试更改要转义的where子句并添加引号,但它不起作用

::whereRaw('"MATCH (users.email) AGAINST (? IN BOOLEAN MODE)"', [$s])
->orWhereRaw('"MATCH (users.username) AGAINST (? IN BOOLEAN MODE)"', [$s])

::whereRaw("MATCH (users.email) AGAINST (? IN BOOLEAN MODE)", ["$s"])
->orWhereRaw("MATCH (users.username) AGAINST (? IN BOOLEAN MODE)", ["$s"])

::whereRaw('MATCH (users.email) AGAINST ("?" IN BOOLEAN MODE)', [$s])
->orWhereRaw('MATCH (users.username) AGAINST ("?" IN BOOLEAN MODE)', [$s])

1 个答案:

答案 0 :(得分:1)

这是MySQL的限制。 From the documentation

  

InnoDB全文搜索不支持在布尔全文搜索中使用@符号。 @符号保留供@distance邻近搜索运算符使用。

此问题已打开bug report,但已通过文档更新关闭。这让我相信他们不认为这是一个错误,这不会很快改变。

您可以尝试将表格更改为MyISAM引擎。这并不理想,根据上面提到的错误报告,仍然可能无法解决问题。

除非您在字段中填充多个电子邮件或用户名,否则我认为您可以使用varchars,普通索引和LIKE查询。由于您似乎只是从字符串的开头搜索(例如email LIKE 'user@%'),因此将使用正常索引。当您需要将通配符放在字符串的开头时,会遇到麻烦。