【问题标题】:php mysql full text search multiple table joined by idphp mysql全文搜索由id加入的多个表
【发布时间】:2015-04-11 10:59:43
【问题描述】:

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

我一直在寻找如何使用全文搜索搜索由 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);
}

如何在搜索时包含 department_name?请帮忙,提前谢谢

【问题讨论】:

    标签: php mysql laravel eloquent query-builder


    【解决方案1】:

    您可以创建一个“物化视图”。 http://en.wikipedia.org/wiki/Materialized_view

    基本上一个表就是JOIN的结果,并在上面创建全文索引。

    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)
    

    但是……

    您将需要定期更新表(或在基础表更新时) - 最简单的方法是 DROP 并重新创建 - 或者您可以使用 TRUNCATE 然后 INSERT INTO ... SELECT ... FROM ... 格式。

    (更复杂的方案涉及保持“视图”更新的触发器,甚至查看二进制日志,并针对“视图”重放更新)

    【讨论】:

      【解决方案2】:

      我认为你太接近你的结果了。使用查询生成器(但未经测试)此代码应该可以工作:

      $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 表中使用 FULLTEXT 的位置以及在哪里不能使用 http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html。将FULLTEXT index 放在您在MATCH() 子句中使用的列或列列表上是一种很好的做法。

      【讨论】:

      • 先生,我怎样才能在搜索时添加来自另一个表的列部门名称,如果只搜索单个用户表,上述查询是有效的
      • 啊,对不起,我完全误会了你。所以不可能在多个表上创建全文索引。为什么不直接添加 whereRaw OR MATCH(departments.department_name) AGAINST(? IN BOOLEAN MODE)", array($q, $q)
      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多