Laravel:使用多个关键字对多列进行搜索,按相关性排序
问题:
在 Laravel 中实现搜索,根据三个输入关键字从多个列中检索数据。搜索结果应按相关性排序,包含所有三个关键字的行排名最高,其次是仅包含前两个关键字的行,最后是仅包含第一个关键字的行。
解决方案:
要按所需顺序查找行,我们首先查询与 meta_name 或 meta_description 列中的所有三个关键字匹配的帖子。此查询进入 $all 变量。
接下来,我们查询仅与同一列中的前两个关键字匹配的帖子。此查询进入 $twoWords 变量,我们排除 $all 中已找到的帖子的 ID。
最后,我们查询仅与任一列中的第一个关键字匹配的帖子,再次排除 $all 中找到的 ID和 $twoWords。此查询进入 $oneWord 变量。
为了获得最终的有序搜索结果,我们合并所有三个查询结果($all、$twoWords、$oneWord)并将其分配给 $posts 变量。
检索搜索结果的代码如下:
$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')); $posts = $all->union($twoWords)->union($oneWord)->get();
搜索结果现在排序如下:
以上是如何在 Laravel 中实现跨多列的相关性排序搜索?的详细内容。更多信息请关注PHP中文网其他相关文章!