首页 >数据库 >mysql教程 >如何在 Laravel 中使用基于相关性的排序跨多个列搜索多个关键字?

如何在 Laravel 中使用基于相关性的排序跨多个列搜索多个关键字?

Linda Hamilton
Linda Hamilton原创
2024-11-06 14:09:02685浏览

How to Search for Multiple Keywords Across Multiple Columns with Relevance-Based Ordering in Laravel?

Laravel:使用基于相关性的排序对多列搜索多个关键字

在 Laravel 中,实现针对多列考虑多个关键字的搜索同时保持相关性可能具有挑战性。本文解决了这样的问题,即搜索结果根据关键字在指定列中出现的频率进行排序。

场景:

搜索栏需要三个关键字作为输入,搜索条件为:

  1. 两列(meta_name 和 meta_description)中包含所有三个关键字的行排在前面。
  2. 仅包含前两个关键字的行上述列中的第一个关键字排在第二位。
  3. 仅包含上述列中的第一个关键字的行排在第三位。

数据库查询:

为了达到预期的结果,数据库查询应该组合多个 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn