Laravel:使用基于相关性的排序对多列搜索多个关键字
在 Laravel 中,实现针对多列考虑多个关键字的搜索同时保持相关性可能具有挑战性。本文解决了这样的问题,即搜索结果根据关键字在指定列中出现的频率进行排序。
场景:
搜索栏需要三个关键字作为输入,搜索条件为:
数据库查询:
为了达到预期的结果,数据库查询应该组合多个 OR 条件,并利用 whereNotIn 函数排除先前条件中已获取的行。
<code class="php">$word1 = 'word1'; $word2 = 'word2'; $word3 = 'word3'; $all = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->where('meta_name', 'like', "%{$word2}%") ->where('meta_name', 'like', "%{$word3}%") ->orWhere(function($query) use ($word1, $word2, $word3) { $query->where('meta_description', 'like', "%{$word1}%") ->where('meta_description', 'like', "%{$word2}%") ->where('meta_description', 'like', "%{$word3}%"); }); $twoWords = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->where('meta_name', 'like', "%{$word2}%") ->orWhere(function($query) use ($word1, $word2) { $query->where('meta_description', 'like', "%{$word1}%") ->where('meta_description', 'like', "%{$word2}%"); }) ->whereNotIn('id', $all->pluck('id')); $oneWord = DB::table('posts') ->where('meta_name', 'like', "%{$word1}%") ->orWhere('meta_description', 'like', "%{$word1}%") ->whereNotIn('id', $all->pluck('id')) ->whereNotIn('id', $twoWords->pluck('id'));</code>
并集和排序:
最后使用 union 函数将 $all、$twoWords 和 $oneWord 结果进行合并,得到有序的搜索结果。
<code class="php">$posts = $all->union($twoWords)->union($oneWord)->get(); // check this first # or $posts = $all->union($twoWords)->union($oneWord)->skip($start)->take($this->rowperpage)->get();</code>
这样可以保证搜索结果是有序的根据指定的条件,从包含指定列中所有三个关键字的行开始。
以上是如何在 Laravel 中使用基于相关性的排序跨多个列搜索多个关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!