我已经阅读了一段时间的全文搜索,我已经阅读了一些文章说它可能但是他们没有提供样本查询,
我找不到如何使用全文搜索搜索由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 ?请帮助,提前谢谢
答案 0 :(得分: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()
。
答案 1 :(得分:2)
您可以创建“物化视图”。 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 ...
格式。
(更详细的方案涉及触发器以保持'视图'更新,甚至观看binlog,并根据'视图'重播更新)