php mysql全文搜索由id连接的多个表

php mysql全文搜索由id连接的多个表,php,mysql,laravel,eloquent,query-builder,Php,Mysql,Laravel,Eloquent,Query Builder,我阅读全文搜索已经有一段时间了,我读过一些文章说这是可能的,但他们没有提供示例查询 我一直在寻找一种解决方法,即如何使用全文搜索来搜索由ID连接的多个表 这是我的小桌子看起来像 这是我到目前为止所拥有的 $users = User::select('users.*','departments.department_name') ->join('departments', 'departments.id', ' =', 'users.dept_id') ->wh

我阅读全文搜索已经有一段时间了,我读过一些文章说这是可能的,但他们没有提供示例查询

我一直在寻找一种解决方法,即如何使用全文搜索来搜索由ID连接的多个表

这是我的小桌子看起来像

这是我到目前为止所拥有的

    $users = User::select('users.*','departments.department_name')
    ->join('departments', 'departments.id', ' =', 'users.dept_id')
    ->whereRaw(
        "MATCH(user_name) AGAINST(? IN BOOLEAN MODE)", 
        array($q)
        )
    ->paginate(10);
}

搜索时我如何包括部门名称?请帮忙,提前谢谢

我想你离结果太近了。使用查询生成器但未经测试此代码应能正常工作:

$user = DB::table('users')
->selectRaw('users.*, departments.department_name')
->join('departments', 'departments.id', ' =', 'users.dept_id')
->whereRaw(
    "MATCH(users.user_name) AGAINST(? IN BOOLEAN MODE) OR
     MATCH(departments.department_name) AGAINST(? IN BOOLEAN MODE)",
    array($q, $q))
)->paginate(10);

在MySQL表中可以使用全文的位置和不能使用全文的位置也有一些限制。在MATCH子句中使用的列或列列表上有全文索引是一种很好的做法。

我认为您离结果太近了。使用查询生成器但未经测试此代码应能正常工作:

$user = DB::table('users')
->selectRaw('users.*, departments.department_name')
->join('departments', 'departments.id', ' =', 'users.dept_id')
->whereRaw(
    "MATCH(users.user_name) AGAINST(? IN BOOLEAN MODE) OR
     MATCH(departments.department_name) AGAINST(? IN BOOLEAN MODE)",
    array($q, $q))
)->paginate(10);

在MySQL表中可以使用全文的位置和不能使用全文的位置也有一些限制。在MATCH子句中使用的列或列列表上有全文索引是一种很好的做法。

您可以创建一个“物化视图”。

基本上是一个表,它是连接的结果,并在该表上创建全文索引

CREATE TABLE materialized (FULLTEXT idx (user_name,department_name)) 
 SELECT u.id,user_name,department_name 
 FROM users u INNER JOIN departments d ON (d.id = dept_id) 
然后可以对该表运行查询

SELECT * FROM materialized WHERE MATCH(user_name,department_name) AGAINST('test' IN BOOLEAN MODE)
但是

您需要定期更新该表,或者在基础表更新时更新-最简单的方法是删除并重新创建-或者您可以使用TRUNCATE然后插入到。。。选择从…起格式


更复杂的方案包括触发器来保持“视图”的更新,甚至可以查看binlog,并根据“视图”重播更新。您可以创建一个“物化视图”。

基本上是一个表,它是连接的结果,并在该表上创建全文索引

CREATE TABLE materialized (FULLTEXT idx (user_name,department_name)) 
 SELECT u.id,user_name,department_name 
 FROM users u INNER JOIN departments d ON (d.id = dept_id) 
然后可以对该表运行查询

SELECT * FROM materialized WHERE MATCH(user_name,department_name) AGAINST('test' IN BOOLEAN MODE)
但是

您需要定期更新该表,或者在基础表更新时更新-最简单的方法是删除并重新创建-或者您可以使用TRUNCATE然后插入到。。。选择从…起格式


更复杂的方案包括触发器,以保持“视图”更新,甚至查看binlog,并根据“视图”重播更新。

sir我如何添加列department_name,该列来自另一个表,搜索时要包括在其中,如果只搜索单用户表,在上述查询中有效啊,对不起,我完全误解了你。因此,不可能在多个表上创建全文索引。为什么不添加whereRaw或MATCHdepartments.department\u name?在布尔模式下,数组$q,$q?先生,在搜索时如何添加来自另一个表的列department_name,在上面的查询中,如果只搜索单个用户表,则可以工作啊,对不起,我完全误解了您的意思。因此,不可能在多个表上创建全文索引。为什么不添加whereRaw或MATCHdepartments.department\u name?在布尔模式下,数组$q,$q?