php - 如何在搜索后先进行完全匹配,然后再进行部分匹配
问题描述
我有以下查询,在搜索框中搜索后会带来结果。它工作正常,只是它不会首先带回更具体的结果。例如,如果我搜索“Learn Laravel”,它会首先带来包括“learn”和“laravel”的结果,然后它会带来两者都有的结果。我试图让查询首先带来确切的结果,然后带来包含这两个词之一的结果。
$searchValues2 = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY);
$posts = DB::table('gl as g')
->join('subcat as a', 'a.id', '=' , 'g.subcat')
->join('steps as s', 's.goal_id','=', 'g.id')
->join('users as u', 'g.user_id', '=' , 'u.id')
->join('country as c', 'c.id', '=' , 'g.country')
->where(function ($q2) use ($searchValues2) {
foreach ($searchValues2 as $value2) {
$q2->orWhere(DB::raw("g.title"), 'LIKE', "%{$value2}%");
$q2->orWhere(DB::raw("s.step"), 'LIKE', "%{$value2}%");
}
})
->where('g.draft_flag', '!=', 1)
->orderby('g.created_at', 'desc')
->take(40)
->groupby('g.id')
->select('g.title as title', 'a.subcat as categ', 'g.id as id', 'u.id as u_id',
'u.first_name as f_name', 'u.last_name as l_name', 'a.subcat as subcat','g.tlike as
tlike','u.avatar as avatar','c.country as country')
->get();
解决方案
你不能用 LIKE 语法来做到这一点。有一些技巧可以用来给 LIKE 语法打分,但在你的情况下,我认为它们不起作用。您可以尝试根据匹配数对集合进行排序,但更好的方法是使用全文搜索。
首先,您应该添加全文搜索索引。
ALTER TABLE gl ADD FULLTEXT title_fulltext (title)
然后: ->select(['....', DB::raw('MATCH (title) AGAINST (\''.$query.'\')')]) ->whereRaw('MATCH (title)反对(?)',数组($查询))
推荐阅读
- google-apps-script - Google Script 在单元格为黑色的 1 列中插入公式
- apache-spark - pyspark中两个时间戳之间的运行总和
- c# - 运算符“||” 不能应用于 aspx 页面上的“布尔”和“字符串”类型的操作数
- javascript - 显示更多/更少切换不会显示所有内容
- android - 关闭应用程序时异步任务不起作用
- json - 服务器端排序的数据未在数据表中以相同的顺序显示
- reactjs - 如何通过 hoc 函数将道具作为类状态名称传递给子组件
- angular - 每个角度模块如何有一种样式?
- javascript - javascript中是否有任何内置函数可以使用类选择器或元素选择器选择最后一个元素?
- java - 从 InnoDB 引擎状态了解 MySQL 死锁日志