如何在 Laravel 中实现跨多列的相关性排序搜索?

Barbara Streisand
发布: 2024-11-05 21:55:02
原创
130 人浏览过

How to Implement a Relevance-Ordered Search Across Multiple Columns in Laravel?

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();
登录后复制

搜索结果现在排序如下:

  1. 包含meta_name或中所有三个关键字的行meta_description
  2. 仅包含meta_name或meta_description中前两个关键字的行
  3. 仅包含meta_name或meta_description中第一个关键字的行

以上是如何在 Laravel 中实现跨多列的相关性排序搜索?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!